見出し画像

データサイエンティストの必須スキルをも拡張させる「データ拡張(Data Augmentation)」 を数式なしで概観

 データ拡張(Data Augmentation)について書きます。データサイエンスの中でも、昨今注目を集めているテクニックであり、データ水増しという表現をされることもあります。この手法は、機械学習における普遍的な課題である過学習(Overfitting)に関わり、またなぜ深層学習(Deep Learning)が学習し、高いパフォーマンスを出せるのかという謎に近づく手がかりでもあります。


データ拡張 

データ拡張は深層学習のモデルを構築したい、しかし、十分なトレーニングデータがないというような際に、有用なテクニックです。複雑なモデルをトレーニングするには、通常沢山の量のデータを必要とします。しかしながら、データが少ない場合においても、データの量を増やしていくテクニックを使うことで十分問題なくモデルを訓練させることができるケースがあります。

画像処理分野でのデータ拡張

データ拡張は、元のトレーニングデータセットの変種を作り出していくことで、データ量を拡張させていく技法です。特に画像処理分野におけるConvolutional Neural Network のトレーニングにうまく作用します。以下にいくつかのテクニック例を上げます。

水平・垂直に画像をシフトする
水平方向・垂直方向に画像を反転させる
回転させる (回転角度はランダムのケースもある)
明度を変える
ズームインする・ズームアウトする
画像の一部をくり抜く、削除する
背景色を変える
背景を置き換える
Mixup・CutMix

 Mixup や、2019年に発表された CutMix はちょっと特殊な技法ですが、それ以外においては、画像データのラベルを変える必要なくデータの量を増やすことができます。例えば、花の画像や料理の画像をAIモデルに識別させようとするとき、画像を回転させることは、花の名前や料理の名前に変更は不要です。つまり、ラベルは変えなくても大丈夫です。それに、実際の写真においては色々な角度からの写真もありえるのでモデルをロバストにするのにも役立ちますし、とても実践的です。
 KerasやTensorFlow、Cognitive Toolkit、imgaug 等の最近のライブラリには、これらのテクニックによってデータを水増ししていく機能を備えています。トレーニングの際に、リアルタイムにデータ拡張を行えるライブラリもあります。


自然言語処理分野でのデータ拡張

画像処理分野だけではなく、例えば、NLP(自然言語処理)にデータ拡張を適用する方法もあります。しかし、単語を一つ別の単語に置き換えるだけで、文章全体の意味が全く変わってしまうように、言語というその複雑な特質を受けて、状況は多少異なります。適用には慎重さを要しますが、同義語や類義語で置き換える、ランダムに語を取り除く等を行うことで短時間で大量のテキストを生成する下記の例があります。もちろん結果の中には完全に意味をなさない文章を作り出してしまうものもあります。ですがそのような際にもモデルのロバストさを高めることに貢献することもあります。直観に反しますがとても興味深いです。

同義語、類義語で置き換える
類似度を計算して置き換える
反意語で置き換える
文章内の語と語を入れ替える
ランダムに削除する
Back Translation を用いて文章を水増しする

例えば以下のような、いくつかのすぐに試せる実装が公開されてます。



 また類似度を計算するには、教師なしクラスタリングや word2vec, GloVe、Fasttext のような word embedding 手法を使うなどもあります。

 Back Translation は、2018年に Facebook AI や Google Brain の研究者らによって発表された機械翻訳分野の手法で、トレーニングデータを大量に生成し、翻訳モデルのパフォーマンスを改善することができます。昨年、BLEUスコアを大幅に上昇させたことで話題になりました。Back Translation の考え方を借用して、元の文章を、他の言語に訳してから、また翻訳し戻します。そうして翻訳戻された文章は水増しされたデータとみなすことができます。文章レベルでなく、語句レベル、フレーズレベルでの適用もありでしょう。トリッキーですが試してみる価値はあります。


数値を取り扱うケースでのデータ拡張

数値を取り扱うケースでのデータ拡張の適用は、欠損データの推計や補完などの形で、従前現場では広く行われています。例えば、欠損データがある際に以下の方法で推計する場合があります。

・0や1 等、決めた値を代入する
・その項目の平均値、最頻値、中央値、移動平均値を代入する(クラスタリングをした上で統計量を入れるケースもある)
・欠損項目を目的変数とした回帰モデルを作り、他の項目を参考にして推定値を代入する(ロジスティック回帰、重回帰、ベイズロジスティック回帰)
・次元圧縮からの復元をして値を入れる


データ拡張とロバストさ

ところで、ロバストという語を前述しました。一般的に、ロバストさ、ロバストネスは、「システムが初期の構成を変更することなく、状況の変化に耐えうる度合い」という意味合いで使われます。コンピューターサイエンスにおいては、実行エラーや誤った入力があっても、それを適切にハンドリングし目的を達成していくプログラムやコンピューターシステムの処理能力を指します。

 画像処理分野におけるユースケース、特に、B2CやC2Cという一般消費者がユーザーとなりうるサービスのケースを考えてみます。今日、スマホが広く普及しており、SNSでの画像共有と相まって、多くの画像データは、スマホで撮影された写真が使われます。例えば、C2Cのフリマアプリはスマホの利用が一般的で、売買されている物品もスマホでその画像が撮影されています。そのような画像データは、完璧な条件で撮影されたものとは限りません。色々な角度からの撮影がありえますし、また部分的に光の反射があったり、他の物の影がうつりこんでいたり、何かによって一部覆われていることもあります。鮮明でないこともあります。画像データの品質は一定ではなく、ばらつきがあるものとなっています。自然言語処理における文章データにおいても同様の状況があります。様々なユーザーが入力した文章データは不完全な文や構造化されていない文、またフレーズの誤用や記述ミス等も含まれます。そのような文章データも適切にハンドリングできるモデルを構築したい場合は、どうロバスト性を高めていくかのアプローチはとても重要です。


 とはいえ、データ拡張の手法は、フレデリック・ブルックスが述べたように、いわゆる銀の弾丸、つまりは万能な解決策ではありません。モデルの推論における精度に悪影響を与えるケースもありえ、注意しなければいけないポイントが存在します。


過学習(Overfitting)

冒頭で書きましたとおり、以前、過学習に関しては解説記事を書きました。過学習とは、モデルがトレーニングデータに適応しすぎたがために、結果として実際の本番データを適切に処理することができなくなることを指します。文字通りトレーニングデータを学習し過ぎるということです。限られたデータセットに対し学習モデルがどれぐらいの距離感で接すればいいのかが不明な際に起こりうるエラーと言うこともできます。
データの量を増やすためにデータ拡張の手法を用いる際には、拡張されたデータセットが実際の本番データの分布に近づいていることが重要になります。そうすることで、データ拡張は過学習回避に寄与します。ですが、本番時でのインプットとなるデータの獲得方法によっては、ズームイン・アウト、回転させる等のシンプルな画像データの拡張テクニックが、実際のデータ分布をカバーすることにあまり寄与しないということもありえます。
工場での例をとりましょう。工場の生産現場で、不良品を発見するために、物体認識の深層学習モデルを構築したいとします。不良品検出のためのカメラは通常定位置に固定されて、決まった角度から物品を撮影することが想定されます。そうすることで撮影画像の品質は安定し、一定品質の検出ができると期待されるためです。カメラの画像条件は安定しているので、画像の回転やズームイン・アウトはここではあまり意味がありません。このようなケースの場合では、画像のバリエーションはどのような形で存在するかを調べ、分析した上で、データセットを広げていくための戦略を考えていくことになります。


ノイズを減らすのか増やすのか

機械学習では一般的にトレーニングデータからノイズデータを除去することは大切であると言われています。トレーニングデータをセットを準備する際は、データのフォーマットを確認し、整え、クオリティを揃えます。そうすることで適切にモデルを学習させることができます。総論としてこれは正しいデータに対する態度です。しかしながら、これが常に当てはまるとは限りません。インターネット上におけるビッグデータやエンドユーザーのデータを取り扱う深層学習のモデル学習を試みるケースにおいては、実際の本番データには多様なノイズが含まれます。つまり、このような場合においてはトレーニングデータにあえてありうるノイズを含ませておくことが効果を発揮します。

先日、グーグルのグループ企業(アルファベットの子会社)であり、無人自動運転車を開発しておる Waymo 社の記事を書きましたが、 Waymo社は2018年12月に初めて自動運転に関する論文を発表しています。

 この論文の中で彼らは、単にデータを複製しただけのような拡張では、現実の車の走行における複雑な状況やシナリオに対処するには不十分であり、実際のリアルな環境のデータをいじるのではなく、センサーから収集された後のデータ、つまりシステムの処理プロセスの中に入ったデータを、モデルに渡す前にランダム化、撹乱するという方法でデータを合成したところ、それが効果を発揮した、と述べています。これは一種の domain randomization ですが、トレーニングのためのノイズの生成として参考になるところがあります。前述したようなMix-upや、ランダムでの画像のくり抜きなどは、精度を向上させるための判断が難しい状況を想定したノイズ混入とみなせるでしょう。
 とは言っても、本番環境における実際のデータ分布や際どいデータのありようと無関係なノイズデータはやはり無意味である可能性は強いです。意図とは異なる過学習を警戒する必要もあります。どのようなノイズを増やし、どのようなノイズを減らすのか、そこは慎重に検討するポイントだと思います。


深層学習の神秘に迫る

データ拡張は、よきにしろ悪きにしろ過学習をどう回避するかという問題と密接に関係しています。実際のデータ分布や起こりうるデータの揺れをもカバーできるようにデータセットを拡充させていくポテンシャルに焦点を当てた技法です。違う言い方をすれば、機械学習モデルが処理することになるであろう本番データのありようについて理解を深めんとする試みでもあります。そういう意味で、データサイエンスにも関わり、今後、データサイエンティストが持つべき基本スキルの一つに位置づけられる可能性もあります。それだけにとどまらず、現実にはありえないデータを生成することになるにも関わらず、モデルのパフォーマンス向上に役立つMix-up 等、興味深いポテンシャルがあります。これはデータのありようということだけでなく、非線形で大量パラメーターの学習という深層学習(Deep Learning)の神秘に迫る手がかりかもしれません。


余談

以下の株式会社 システム計画研究所のつくばチャレンジにおける記事は、データ拡張手法の実例として非常に参考になるところが多い記事です。


 小さいデータセットから効果的、効率的にモデルを訓練する方法に関しては、以下の転移学習の活用も検討してもいいかもしれません。

以下は、本記事のスライド板です。


この記事が気に入ったらサポートをしてみませんか?