転移学習：機械学習の次のフロンティアへの招待

機械学習を実務で使う場合、「ではお客様、ラベルデータを・・・」と申し出て色よい返事が返ってくることはあまりありません。また、例えば自動運転車を作るときに、データが足りないからその辺流してくるか、お前ボンネットに立ってデータとってな、とするのは大変です。

![nico2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/0db98f8b-6e2f-6a3f-bb34-564a8ce6dbec.png)
[NICO Touches the Walls 『まっすぐなうた』 より](https://www.youtube.com/watch?v=6_fDwHh31i8)

そこで必要になってくるのが転移学習です。
転移学習とは、端的に言えばある領域で学習させたモデルを、別の領域に適応させる技術です。具体的には、広くデータが手に入る領域で学習させたモデルを少ないデータしかない領域に適応させたり、シミュレーター環境で学習させたモデルを現実に適応させたりする技術です。これにより、少ないデータしかない領域でのモデル構築や、ボンネットに立つという危険を侵さずにモデルを構築することができるというわけです。

この転移学習の可能性は、NIPS 2016 Tutorialにて、あのCourseraの講師であるAndrew Ng先生が言及されています。機械学習の成功を今後推進するのは(最初の推進は教師あり学習)、教師なし学習、そして最近目覚ましい進化を遂げている強化学習でもなく、転移学習である、と。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/317fb3aa-e8d2-6ce6-087c-fc15ea92a955.png)
[Transfer Learning - Machine Learning's Next Frontier より](http://sebastianruder.com/transfer-learning/index.html)

本記事では、上の図の引用元でもある[Transfer Learning - Machine Learning's Next Frontier](http://sebastianruder.com/transfer-learning/index.html)に刺激を受け、転移学習をこれから始めてみたい、という方にとって起点となるような内容をまとめます。私自身注力したかった分野でこの記事には先を越された感がすごいあったのですが、ここは先人のまとめを糧にさらに先へ、また多くの方により参考になる内容になればと思います。

# 機械学習における「ドメイン」

転移学習において重要なキーワードとして、「ドメイン」があります。転移学習はある領域=ドメインで学習させたモデルを、ほかの領域に適用する技術ですから、まずはこの「ドメイン」を定義しておきます。
以下は、文章に含まれる単語からそのタグを予測するようなモデルを図式化したものです。

![tf_domain2.png](https://qiita-image-store.s3.amazonaws.com/0/25990/32eb7a0d-fd61-32d0-a948-27ba58bcbb15.png)

* 観測データ($X$)：記事のデータセット
* 予測ラベル($Y$)：記事のタグ
* (確率)モデル($P(Y|X)$)：観測データがXの時、予測ラベルがYである確率

これらを一まとめにしたものが「ドメイン($D$)」になります。そして、転移学習においては元のドメインを「ソース($D_S$)」、転移先のドメインを「ターゲット($D_T$)」と呼びます。
$D_S$で構築したモデルを$D_T$に(より少ないデータで)適応させること、それが転移学習のミッションです。

![tf_transporter.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/1f2b9f04-979a-8ca8-b1e0-c7c45d04bcc4.png)
[トランスポーター より](http://tp3.asmik-ace.co.jp/)

# 転移学習の取り組む問題

当然ながら、この「ドメイン間の運び屋(トランスポーター)」の行く手には様々な障害があります。その、想定されるシナリオを順を追って解説していきたいと思います。

## 観測データが異なる

タスクは同じでも、観測データが異なるケースです($X_S \neq X_T$)。具体的には、以下のように言語が異なる場合などが挙げられます。

![tf_task1.png](https://qiita-image-store.s3.amazonaws.com/0/25990/b72de24b-1c72-f5fc-e986-42d78bd1ebac.png)

このケースへの取り組みは、Cross-xxx Adaptation(言語の場合なら、Cross-lingual)と呼ばれます。

## 観測データの分布が異なる

観測データは同じですが、その頻度が異なるケースです($P(X_S) \neq P(X_T)$)。実例としては、あるサイトで学習させたモデルを別のサイトで使うというとき、サイト間で話題が異なる(単語の出現頻度が異なる)といったケースが考えられます。

![tf_task2.png](https://qiita-image-store.s3.amazonaws.com/0/25990/b82164bc-79b0-874f-4dae-db5bc407be70.png)

このケースへの取り組みは、Domain Adaptationと呼ばれます。新しい環境に適応させるイメージですね。

## ラベルが異なる

予測ラベルが異なるケースです($Y_S \neq Y_T$)。自然言語のタスクだとあまりないかもですが(転用が効かないケースが多いため)、画像だと異なるラベルに転用するというのは多いと思ます。

![tf_task3.png](https://qiita-image-store.s3.amazonaws.com/0/25990/c83b6248-8cc6-a03d-fcd2-aca8eb44bd7d.png)

このケースへの取り組みは、Fine Tuningと呼ばれることが多いかもしれません。

## ラベルの分布が異なる

ラベルの出現頻度が異なるケースです($P(Y_S) \neq P(Y_T)$)。元のサイトではあまりなかったタグの文章が、摘要先のサイトでは多い、といった感じです(元のサイトは料理の記事が多かったが適用先は経済の記事が多いなど・・・)。
([元の記事](http://sebastianruder.com/transfer-learning/index.html)では条件付確率の差異になっていましたが、意味的にこちらの方が適していると思ったので修正しています)

![tf_task4_2.png](https://qiita-image-store.s3.amazonaws.com/0/25990/00ceffe8-aebf-47b1-442c-ae1f5952e1f0.png)

これは教師データの収集に際して特定のサンプルが多くなってしまった場合などにも起こるので、実際に直面する機会は多いかもしれません。

もちろん、上記4つのシナリオは複数が同時に発生することもあり得ます。これらのシナリオを克服することで、以下のようなことが可能になります。

* シミュレーターによる事前訓練
* 近い分野で学習させたモデルの転用
* モデルの個別化(ユーザーへの適応(音声認識など))

では、その克服のためにはどのような方法があるのか、についてみていきたいと思います。

# 転移学習を行うためのアプローチ

転移学習を行うためのアプローチとしては、以下のような手法があります。

## 学習済みモデル(Pre-trained Model)の適応

画像認識の世界では多くの「事前学習済み」のモデルが公開されており、これを利用することで新しいドメインへの適応が可能なことが実証されています。「実証」という通り、なぜうまくいくのかはよくわかってないのですが、どうやらConvolutional Neural Network(CNN)の下層の方では汎用的な特徴を学んでいるらしいという経験則があります。

![tf_architecture.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/ce38afdd-b81d-e1cc-9cf9-f1ff1ae972ca.png)
[CS231n: Convolutional Neural Networks for Visual Recognition Lecture 7より](http://cs231n.stanford.edu/syllabus.html)

そのため、上図のように入力に近い部分の重みを固定し、出力に近い部分だけ学習させることで新しいドメインへの適用を行うことができます。

画像においてこの転移がうまくいっているのは、以下の要因があるためと考えられています。

* 画像における様々なタスクにおいて、「共通してとらえるべき特徴」が存在する
* 「共通してとらえるべき特徴」を得るのに、画像認識(クラス分類)が有効である

つまり、「タスク間に何らかの共通点」があり、その「共通点を学習する方法」が判明している、ということがポイントとなっています。
逆に自然言語においては、これらの点がまだ明らかになっていません。言語モデルは幾分か役に立ちますが(事前学習済みのword2vecを利用するなど)、画像のクラス分類ほど汎用的な特性の獲得には至っていないのが現状です。

強化学習では、最近「学習結果の持越し」に関する研究が行われています。まだ事前学習済みモデルが活用されるという段階ではありませんが、将来的にはその普及と活用方法が明らかになってくるかもしれません。以下の研究では、AtariのPongというゲームからAlienというゲームに移行していますが、Alienの時にPongの学習結果が活かされています。

![tf_rl_transfer.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/dc1ec7a2-88c3-a2c9-ed3b-9ccf39a2e700.png)
[PathNet: Evolution Channels Gradient Descent in Super Neural Networks](https://github.com/arXivTimes/arXivTimes/issues/191)


## ドメイン非固有の特徴の学習

CNNの下層を利用する方法、またword2vecに代表される分散表現に似ていますが、ドメインをまたいで使える表現を学習しようというアプローチです(表現学習(Representation Learning)と呼ばれます)。
代表的な手法としては、Auto Encoderなどがあります。

![ExampleSparseAutoencoderWeights.png](https://qiita-image-store.s3.amazonaws.com/0/25990/a6547d8c-48b7-cd07-ec63-2fe157a61fcb.png)
[UFLDL Tutorial Autoencoders より](http://ufldl.stanford.edu/tutorial/unsupervised/Autoencoders/)

最近は、GANを利用してその生成過程で獲得されている表現を抽出しようという試みも行われています。

* [Adversarial Autoencoders](https://github.com/arXivTimes/arXivTimes/issues/259)
* [Adversarial Feature Learning](https://arxiv.org/abs/1605.09782)

自然言語における表現学習については、こちらの資料にとてもよくまとまっています。

[Representations for Language:From Word Embeddings to Sentence Meanings](https://nlp.stanford.edu/~manning/talks/Simons-Institute-Manning-2017.pdf)

## ドメインの違いを学習させる

最近行われているアプローチとして、あらかじめ「ドメイン間の違い」を認識させるというものがあります。ドメイン固有の部分とそうでない部分を意図的に分けるという形です。

![tf_domain_recognition.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/79290fd4-31e3-4b84-5a3a-69c4fbfe0dff.png)
[Confusing domains with a gradient reversal layer (Ganin and Lempitsky, 2015)](http://sebastianruder.com/transfer-learning/index.html#fn:22)

関連の研究としては、以下のものがあります。

* [Domain Separation Networks](https://github.com/arXivTimes/arXivTimes/issues/126)

最近発表されたDiscoGANなども、同様に「ドメイン間の変換」をあらかじめ学習させるアプローチです

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/bd35a1dd-3d1a-6388-8525-71b89ba10564.png)
[Learning to Discover Cross-Domain Relations with Generative Adversarial Networks](https://github.com/arXivTimes/arXivTimes/issues/249)

GANを用いてドメイン間の変換を学習させる研究はほかにもいくつかあり、今後も出てくると思います。

* [Unsupervised Cross-Domain Image Generation](https://github.com/arXivTimes/arXivTimes/issues/172)
* [Unsupervised Pixel-Level Domain Adaptation with Generative Adversarial Networks](https://github.com/arXivTimes/arXivTimes/issues/121)
* [Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks](https://github.com/arXivTimes/arXivTimes/issues/261)

# 転移学習の関連領域

転移学習を実現する手段について解説を行ってきましたが、最後に転移学習とかかわりの深い領域について紹介をしたいと思います。

## 少ないデータでの学習

転移学習したいのはそもそも少ないデータでも学習が可能なようにする、というモチベーションがありました。それに直接取り組むという研究があります。

* Semi-supervised learning(半教師あり学習)
  * 少ないラベル付きのデータと、その他大勢のラベルの付いていないデータで学習をする方法です。予測精度の高かったものは教師ラベルとしてしまう(Self-training)などの手法があります。[こちら](http://yamaguchiyuto.hatenablog.com/entry/machine-learning-advent-calendar-2014)によくまとまっています
* Active Learning
  * 学習によく「効く」ラベル付きデータを選んで学習する手法です。[こちら](https://www.slideshare.net/shuyo/introduction-to-active-learning-25787487)の資料がわかりやすいです
* x-shot learning
  * 1-shot、はてはzero-shotといった、一枚だけ画像を学習させて、あるいはまったく学習させずに未知のデータを分類などするタスクのことです。
  * [外部メモリを使った手法](https://github.com/arXivTimes/arXivTimes/issues/170)や、[事前知識を組み込む手法](https://github.com/arXivTimes/arXivTimes/issues/162)などが提案されています。

## マルチタスクの学習

転移するのでなく、そもそもマルチタスクが解けるモデルを作ってしまおうという試みです。画像分野では、領域識別とクラス分類を同時に解かせるといった方法が早い時期からとられています。

![tf_multitask.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/ddaaa97e-1072-020a-25b3-562b1332a8fa.png)
[CS231n: Convolutional Neural Networks for Visual Recognition Lecture 11より](http://cs231n.stanford.edu/)

最近では、領域だけでなくその中の物体領域(セグメンテーション)の認識も併せて解かせるという研究もありました。

* [Mask R-CNN](https://github.com/arXivTimes/arXivTimes/issues/253)

また、自然言語の分野でもマルチタスクを解かせる研究が行われています。

![tf_multitask2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/29d69b78-fb2b-7255-3e71-553bd166ba0a.png)

[A Joint Many-Task Model: Growing a Neural Network for Multiple NLP Tasks](https://arxiv.org/abs/1611.01587)

この研究では、品詞づけ・文節判定・係り受け・文意関係(補強・反対・普通)・文関係の度合い、といった複数のタスクをこなす一つのネットワークを構築し、最高精度を達成します。

強化学習においても、補助タスク(auxiliary tasks)を解かせることで学習速度・精度を上げる試みが行われています。

![tf_multitask3.PNG](https://qiita-image-store.s3.amazonaws.com/0/25990/3369ec81-76a1-643d-d31c-43472334ee60.png)

[REINFORCEMENT LEARNING WITH UNSUPERVISED AUXILIARY TASKS](https://github.com/arXivTimes/arXivTimes/issues/56)

## 学習の仕方を学習

「どう学習すればいいか」がわかっていれば、異なるドメインにおいても素早く最適なモデルを構築することができます。こうした「学習方法の学習」はメタラーニングと呼ばれる領域になります。

[Neural Architecture Search with Reinforcement Learning](https://github.com/arXivTimes/arXivTimes/issues/23)

まだ人手よりは効率的なパラメーターサーチに近い状態ですが、今後進展してくればより少ないデータでのモデルの学習にも応用できるかもしれません。

いかがだったでしょうか。転移学習を利用することで、機械学習はそれほどデータが取れない領域にも進出することが可能になるかもしれません。その「次のフロンティア」に漕ぎたすにあたり、本記事が参考となれば幸いです！

![20130825182548.jpg](https://qiita-image-store.s3.amazonaws.com/0/25990/ba38b0b0-db72-4ac0-e302-3f0982336d2a.jpeg)
[トランスポーター3　アンリミテッド より](http://tp3.asmik-ace.co.jp/)

なお、今回論文の引用に使用したarXivTimesは、論文の一言まとめを共有しているGitHubリポジトリになります。今後も論文をどんどんシェアしていこうと思っていますので、よろしければStar & フォロー頂ければと思います。投稿・またコメントもお待ちしています！

* [arXivTimes GitHub](https://github.com/arXivTimes/arXivTimes)
* [arXivTimes Twitter](https://twitter.com/arxivtimes)