半教師あり学習自分用にメモ
半教師あり学習について調べようと思ったので、初歩的な手法としてTemporal ensembling、Mean teachers、UNSUPERVISED DATA AUGMENTATION(UDA)、MixMatchについて調べました。
間違いがあったら教えてください。
- そもそも半教師あり学習って何?
- Temporal Ensembling for Semi-Supervised Learning
- Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results
- UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING
- MixMatch: A Holistic Approach to Semi-Supervised Learning
- 自分用用語メモ
そもそも半教師あり学習って何?
現実問題、ラベルあり画像(教師ありデータ)を大量に用意することは難しい。
だけどラベルなし画像(教師なしデータ)を用意するのは簡単。
そこで少量の教師ありデータと大量の教師なしデータから学習する手法として半教師あり学習が提案されている。
Temporal Ensembling for Semi-Supervised Learning
本報告ではΠ-modelとTemporal ensemblingが提案されている。
ここで
:学習データ
:正解ラベル
:バッチサイズ
:何エポック目か
:時間に依存する重み。0から始めるramp up 関数
とする。
Π-model
確率的なData Augmentation と 確率的にDropoutの位置を変えるネットワークを用いる。
流れは以下のようになる。
上図にも書いてあるが損失関数は以下のように定義されており、前の項(黄色線)が教師あり損失関数項、後ろの項(赤線)が教師なし損失関数項となる。
アルゴリズム全体
TEMPORAL ENSEMBLING
流れは以下のようになる。
損失関数は先と同じ。
学習後、 を更新することにより、ネットワーク出力がアンサンブル出力に累積される。
生成するには、因子 (1−αt) で除算する。
アルゴリズム全体
Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results
構成と流れは以下の図のようになる。
TeacherモデルとStudentモデルは同じ構造をしている*1。
classification cost
SoftmaxCrossEntropyを用いている。
consistency cost
Studentモデルの重みを、ノイズを
Teacherモデルの重みを, ノイズを
とすると以下のように書ける。
※この論文ではMSEを使ってるがKL-divergenceなどでも良い。
ちなみにモデルには3つのノイズが入っているが、詳しくは以下のような構成となっており、入力でははRandom Translation、Horizonal flip、Gauusian noiseを、中間層ではDropoutをノイズとして扱っている。
Mean Teacherでは、学習ステップでのを以下の式のようにした。
Teacherモデルの重みはStudentモデルの重みの 指数移動平均(Exponential Moving Average) を用いている。
ここでαはハイパーパラメータ。
確率的勾配降下法(SGD)を用いて各学習ステップでノイズ, をサンプリングすることによってconsistency costを近似できる。
総コストは以上2つのコストの加重合計としている(詳しくは以下)。
教師ありデータのとき
教師ありデータが入力にきたとき classification cost と consistency costを求める。
教師なしデータのとき
教師なしデータが入力にきたとき正解ラベルがなくclassification costを求めることができないため、consistency costのみを用いる。
こうすることでラベルなし画像もうまく学習に組み込むことができるため半教師学習であると言える。
UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING
今までは教師なしデータに対して、何かしらの摂動・ノイズ(例えばガウスノイズとかDropoutとか)を加えた。それらをモデルに入力した時の出力が(差の二乗和やKL-divergenceなどを使って)ばらつかないようにするというものであった。
この論文ではガウスノイズやDropoutなどではなく、より現実的なdata augmentationを用いる。
UDAの概略図
RandAugment
RandAugmentについてはよく分からないけど、Data Augmentationを自動で行うAuto Augmentを、学習と同時に行う手法らしい。
他の様々なタイプのノイズも(ガウスノイズ、敵対的ノイズなど)試したが、本手法のようにdata augmentationを用いたらより優れている結果がでたらしい。
MixMatch: A Holistic Approach to Semi-Supervised Learning
ここでは
バッチサイズを
教師ありデータを
教師なしデータを
とします。
step1
ラベルあり画像(教師ありデータ)に対してdata augmentation(ランダム水平反転処理やランダムクロップ処理など)を行い新たな画像を作る。
step2
同様にラベルなし画像(教師なしデータ)に対してもdata augmentationを行い新たな画像を作る。
ラベルなし画像をdata augmentationする時、K回行いK個の新たな画像を作る。
step3
step2で生成したdata augmentation後のラベルなし画像に対して、モデルでラベルを予測する。
data augmentation後のラベルなし画像はK個あるので、K個分モデルで予測することになる。
step4
step3の予測値を平均する。
これで得られる値を とする。
step5
step4で出力した平均値をSharpen(エントロピーを小さく)する。
TはハイパーパラメータでT→0でonehotに近づくようになっている。
これにより得られる値をとする。
step6
以下のようにラベルありデータは(画像,ラベル)のペアにする。
以下のようにラベルなしデータは(画像,疑似ラベル)のペアにする。
step7
ラベルありデータとラベルなしデータそれぞれをMixupする。
合成するデータはラベルありデータでもラベルなしデータでも良い。
これにより得られる合成後のラベルありデータを 、合成語のラベルなしデータを とする。
step8
(合成後の)ラベルありデータ の予測値と(合成後の)正解ラベル に対し、CrossEntropyを計算する(ラベルありデータの損失関数項)。
(合成後の)ラベルなしデータ の予測値と(合成後の)生成したラベル との差の二乗和を計算する(ラベルなしデータの損失関数項)。
そしてそれぞれを加算し、損失関数とする。
ここで
はハイパーパラメータ
はの次元数
とする。
step9
step1~step8を繰り返して学習を行う。
MixMatchアルゴリズム
step1~step7をまとめると以下のようになる。
ReMixMatch
最近これの進化系ReMixMatchという論文が出たらしいです。
以下の記事が非常に詳しく書いていたのでここでは解説は省きます。
自分用用語メモ
Sharpen
Pseudo-label
*1:Temporal ensemblingはTeacherモデルとStudentモデルともに同じネットワークを共有するが、Mean teacherはそれぞれ別々のネットワーク(構造は同じ)を使うという点に注意
Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Data
Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Dataのメモです。超適当です。
どんなもの?
従来CycleGANはある画像を与えたら決まった画像が出力される。
(例えば以下の図のようにhorse→zebraの変換を行った時、1枚のhorseの画像からは決まったzebraの画像が出てくる。縞模様が多少変化して出力されるとかは起きたりしない)
本論文ではタイトルにもあるようにCycleGANに多数対多数の変換を学習させることに成功したというものである。
先行研究と比べてどこがすごい?
以下はエッジ→靴の変換の結果だが、様々な色の靴の画像が生成されていて、従来の一対一の変換ではなく多様な画像の生成ができている。
技術や手法のキモはどこ?
多様な画像を生成するなら、単純にCycleGANにノイズを加えればいいじゃ~んというノリでやると
Cycle-consistency lossが邪魔をしてうまくいかない時がある。
Augmented CycleGANでは潜在変数を用いる。
と のペアのマッピングを学習させる(潜在変数の推論を行う)。
Let Z be a latent space with a standard Gaussian prior p(z) over its elements.
→ のマッピングを行い、
以下の損失関数(論文ではMarginal Matching Lossと呼んでいる)に入れる
さらに以下のようにマッピングを行い
以下の Cycle-consistency lossに入れる。
逆の変換も同様に行う。
最終的には以下の損失関数を最適化することになる。
※ と はハイパーパラメーター
どうやって有効だと検証した?
議論はある?
次に読むべき論文は?
参考
http://proceedings.mlr.press/v80/almahairi18a/almahairi18a.pdf Augmented CycleGAN: Learning Many-to-Many Mappings from Unpaired Data on Vimeo
その他
著者実装(pytorch)がある。
https://github.com/aalmah/augmented_cyclegan
bert as service のベクトル表現を用いて文書分類メモ
日本語BERTで文表現ベクトルを得る環境を作る
日本語BERTによってベクトルを出せるようにする
以下の記事の通りに、日本語BERTによって文表現ベクトルを計算するサーバーを作ります。
https://qiita.com/shimaokasonse/items/97d971cd4a65eee43735
※Google Colabolatoryでやる場合は
!pip install bert-serving-client !pip install -U bert-serving-server[http] !nohup bert-serving-start -model_dir=./bert-jp/ > out.file 2>&1 &
from bert_serving.client import BertClient bc = BertClient()
としないと動かないです。
以上でbert-as-serviceから文表現ベクトルを得ることができました。
文書分類
分類するためのデータセットの準備
live コーパスを使っていきます(9クラス分類)。
live コーパスをダウンロードし,解凍します。
$ wget https://www.rondhuit.com/download/ldcc-20140209.tar.gz $ tar zxf ldcc-20140209.tar.gz > /dev/null
データセットの整形
とりあえず以下のような形にもっていきます。
Text | Label | |
---|---|---|
0 | text1 | label1 |
1 | text2 | label2 |
2 | text3 | label3 |
... | ... | ... |
import os import random import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split import numpy as np import glob def parse_to_wakati(text): return text categories = [ "sports-watch", "topic-news", "dokujo-tsushin", "peachy", "movie-enter", "kaden-channel", "livedoor-homme", "smax", "it-life-hack", ] docs = [] for category in categories: for f in glob.glob(f"./text/{category}/{category}*.txt"): # 1ファイルごとに処理 with open(f, "r") as fin: # nextで1行取得する(__next__を呼ぶ) url = next(fin).strip() date = next(fin).strip() title = next(fin).strip() body = "\n".join([line.strip() for line in fin if line.strip()]) docs.append((category, url, date, title, body)) df = pd.DataFrame( docs, columns=["category", "url", "date", "title", "body"], dtype="category" ) # 日付は日付型に変更(今回使うわけでは無い) df["date"] = pd.to_datetime(df["date"]) # wakati body df = df.assign( Text=lambda df: df['body'].apply(parse_to_wakati) ) # ラベルエンコーダは、ラベルを数値に変換する le = LabelEncoder() # ラベルをエンコードし、エンコード結果をyに代入する df = df.assign( Label=lambda df: pd.Series(le.fit_transform(df.category)) ) labels = np.sort(df['Label'].unique()) labels = [str(f) for f in labels] idx = df.index.values idx_train, idx_val = train_test_split(idx, random_state=123) train_df = df.loc[idx_train, ['Text', 'Label']] val_df = df.loc[idx_val, ['Text', 'Label']]
↑のコードを実行するとTextとLabelのペアを作ることができます。
↓train_dfの一例
自作データとかの場合train_dfのような形 Text, Label となるようにCSVファイルを既に用意してもらった方が簡単化と思います。
Kerasで分類する
Kerasを用いてbert as serviceから得られたベクトル表現に対して分類をします。
以下でネットワークを構築します。
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from keras.models import Sequential from keras.layers.core import Dense, Activation from keras.utils import np_utils from sklearn import preprocessing # BERTから得るベクトル表現をこのモデルに流し込む def build_multilayer_perceptron(): model = Sequential() # 隠れ層512は好きに変えて良い model.add(Dense(512, input_shape=(768,))) model.add(Activation('relu')) # liveコーパスは9クラス分類なので9 model.add(Dense(9)) model.add(Activation('softmax')) return model x = train_df["Text"].values.tolist() x = list(map(parse,x)) X = bc.encode(x,is_tokenized=True) Y = train_df["Label"].values train_X, test_X, train_Y, test_Y = train_test_split(X, Y, train_size=0.8) print(train_X.shape, test_X.shape, train_Y.shape, test_Y.shape) model = build_multilayer_perceptron() model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
分類を実行します。
# epoch数,batch_sizeは適宜変更する model.fit(train_X, train_Y, nb_epoch=200, batch_size=16, verbose=1) """ 4420/4420 [==============================] - 1s 184us/step - loss: 0.0265 - acc: 0.9930 Epoch 198/200 4420/4420 [==============================] - 1s 177us/step - loss: 0.1637 - acc: 0.9493 Epoch 199/200 4420/4420 [==============================] - 1s 184us/step - loss: 0.2781 - acc: 0.9120 Epoch 200/200 4420/4420 [==============================] - 1s 179us/step - loss: 0.0248 - acc: 0.9943 """
評価します。
# モデル評価 loss, accuracy = model.evaluate(test_X, test_Y, verbose=0) print("Accuracy = {:.2f}".format(accuracy))
transformersのBERT
色々めんどくさいことしましたが transformers を使えば日本語学習済BERTを非常に簡単に利用できるようになりました(つい最近)。
https://twitter.com/huggingface/status/1205283603128758277
huggingface/transformers の日本語BERTで文書分類器を作成する記事 https://qiita.com/nekoumei/items/7b911c61324f16c43e7e
試してみたら非常に簡単でした。
分類 BertForSequenceClassification だけでなく以下から色々なタスクを扱えるようです。
# Each architecture is provided with several class for fine-tuning on down-stream tasks, e.g.
BERT_MODEL_CLASSES = [BertModel, BertForPreTraining, BertForMaskedLM, BertForNextSentencePrediction,
BertForSequenceClassification, BertForTokenClassification, BertForQuestionAnswering]
bert as serviceは一応CPUでも動くようなのでGPUないけど回したいみたいな人にはいいのかなと思いました。
NLP界隈の人間ではないので詳しいことまでは分かりませんが。
eXpose: A Character-Level Convolutional Neural Network with Embeddings For Detecting Malicious URLs, File Paths and Registry Keys
論文リンク:https://arxiv.org/abs/1702.08568
※少し古めの論文です
CLCNN(Character-Level Convolutional Neural Network)とは
CNNは画像に対して提案された手法で、基本的に自然言語では時系列モデルであるRNNとかLSTMが用いられる。
CNNを自然言語処理でも用いるなら1次元方向のみの畳み込みになる。
https://www.slideshare.net/sheemap/convolutional-neural-netwoks より
実際にCNNを用いて文書分類を行ったネットワークが Character-Level Convolutional Neural Networks(CLCNN)で高い精度を達成している。
処理の流れ
①文字を局所表現(埋め込み表現)にする
②カーネルサイズが違う枚数のCNNに並列に入れて特徴を出力
https://www.slideshare.net/tdualdir/devsumi-107931922 より
③特徴を1つに結合
④全結合層に通して分類
となる。
全体のモデルの構造は以下のようになる。
次回は CE CLCNN について書きます。
twitterの顔アイコンを描く
彌冨研アドベントカレンダー16日目を担当させて頂きます。
B4のほっとここあです。
私は4年生になって初めてエンジニア界隈の人をtwitterでフォローしました。
皆さん個性的なアイコンで面白いですよね。
あとアニメイラストをアイコンにしている人多いなぁと感じました。
でも時々「(え...そのアイコン無断使用して大丈夫なん...!?)」と思うときがあります。
気持ちは分かるし自分だってめっちゃうまい絵師が描いたイラストをアイコンにしたいですが怒られたら嫌なのでやってません
そこで発想を転換します。自分で描けばいいんだ...!というわけで簡単にデジタルで描く記事を書きました。
(GANで生成したアニメ画像って著作権どうなるんだろう?)
デジタルで描くって何?
私が大学1年生のとき、「そもそもデジタルで描くって何?」と思っていたので一応説明しておきます。
デジタルで描くとは、パソコン・ペンタブ・液タブのような電子機器を用いて描くことを指します。
対称にアナログで描くとは、紙にペン・絵具、水彩(マーカー)のようなものをもちいた、電子機器を用いずに描くことを指します。
画材
一般的に、絵を描くために使う道具を画材といいます。
デジタルイラストの場合は大きく分けると次の 3つが必要です。
- グラフィックソフト
- 後述
- パソコン
- 動けば何でもいい
- ペンタブレット
※最近ではipadでもイラストを描けるようになり,ipadとApple Pencilを持っていれば誰でも気軽にお絵描きできるようになりました。
グラフィックソフト
絵を描くためのソフトウェアです。ペイントソフトとも呼ぶそうです。 よく使われるものとして以下のソフトウェアが挙げられます。
・CLIP STUDIO PAINT PRO/EX
・Adobe Photoshop CC
・Medibang Paint Pro(無料)
・アイビスペイント(無料)
など
5,000円程かかりますがこの中で1番おすすめなのはCLIP STUDIO PAINTです。機能が非常に多く、ユーザサポートが充実しているからです。
正直これで5,000円でいいの??って思うくらいです。
ですが今回は無料で使えるMedibang Paint Proを使ってイラストの工程を書いていこうと思います。
実際に描いていく
顔についてざっくり
ざっくり自分が顔を描くとき考えてるのは以下です。
ただ最近はフリーのトレス素材が充実しているため参考にしたりなぞったりして絵を描いたりしてもいいと思います。
「顔 トレスフリー」とかで調べると良いと思います。著作権が心配なので画像は載せませんが、吉村拓也さんという方がトレスフリー画像や絵の描き方をtwitterなどで共有していておすすめです。いつも助かっています。
顔のアタリを描く(トレスフリー素材を使わない時)
顔のアタリを描きていきます。身体のラフも入ってますが気にしないで下さい。
どうせtwitterのアイコンには入りきらないので。
アタリをもとにラフを描く
ラフをもとに線画
ブラシはペン(4px)を使っています。色は黒です。
髪の毛のパターンとかどうすればええねん...ってなりますが基本的に色んな参考絵の髪のパターンを組み合わせて丸パクリ感を消していきます(今回関係ないけど服のシワパターンもそんな感じ)。弊研だとアンサンブルでやるって言えば理解できるかな。
髪はつむじから流れを意識して描きます。また元のラフより少し離して描きます。
塗る(これは見なくていい)
「!?」と思ったかもしれませんが自分が塗るとこんな感じです。いきなりこの塗りに挑戦しようとすると難しいので誰でも簡単にできる塗りを紹介しようと思います。
塗り講座
さっきまでのイラストと同じような工程で以下の線画を描きました。
こっから色塗りに入りますがその前にレイヤーについて理解しておいてください。
* レイヤーについて
乗算レイヤーという合成レイヤーを使って塗る初心者向けのアプローチで塗ります。
ざっくり以下のリンクを見てください。
* 乗算で影を塗る
↓新しいレイヤーを線画レイヤーの下に作ってグレーで影を描きます。 影を描いた後、影を描いたレイヤーブレンドを乗算レイヤーにして下さい。
↓新しいレイヤーをさらに線画レイヤーの下に作って下塗りを描きます。
目を塗る
※目だけに塗りを適用したいときクリッピング機能が役に立ちます
クリッピング機能について
↓目の下らへんにオレンジ追加
↓グラデーション(黒)
↓瞳(黄色)
↓ハイライト(白)
髪にハイライトをつける
顔に赤をのせる
それっぽいの完成
もうワンステップレベルを上げた塗り
先程の塗りでも十分良いのですが、グラデーションを使ってもっと塗りを良くします。
できました!
他にもテクスチャを使って水彩っぽくする技術もあるのでもしよかったら以下の記事読んでください。
アニメ塗りを水彩画風にする
あとがき
最近初心者でも気軽にイラストが描けるようになりました。
↓3Dを使って楽に描いたり
https://hotcocoastudy.hatenablog.jp/entry/2019/02/20/013653
分かりやすい塗りの本とかも増えてきてとても嬉しいです。
↓塗りの参考書読みながら描いたイラスト
https://hotcocoastudy.hatenablog.jp/entry/2019/03/23/115503
というわけで深層学習とは無縁の記事でした、ありがとうございました。
AUGMIX: A SIMPLE DATA PROCESSING METHOD TO IMPROVE ROBUSTNESS AND UNCERTAINTY 自分用にメモ
論文リンク
AugMix: A Simple Method to Improve Robustness and Uncertainty under Data Shift | OpenReview
公式実装(Pytorch)
GitHub - google-research/augmix: AugMix: A Simple Data Processing Method to Improve Robustness and Uncertainty
どんなもの?
Datasetのshiftの下で、堅牢性と不確実性を改善する、シンプルだけど効果的な方法を提案。
下のgif(公式実装より引用)を見ると概要が良く分かる。
先行研究と比べてどこがすごい?
Hendrycks&Dietterichによって提案されたベンチマークで目に見えない崩壊?に対する堅牢性を大幅に改善したらしい。
CIFAR-10-C、CIFAR-100-Cで前のSOTAと Clean Error(壊れてないtestデータに対する通常の分類Error)の差を半分以上縮めたらしい。
よく分からないけどとりあえずError率下がったってことかな...?
(https://twitter.com/balajiln/status/1202764043733229568 より)
技術や手法のキモはどこ?
連続してシフト処理(多分色空間的なシフトも含む?)みたいなことをすると元の画像から遠く離れた(異なる)画像を生成し、非現実的な画像になってしまうことがある(下図)。
でもこの違いは、ステップ数を調整することでバランスを取れる。
複数の拡張画像を生成してmixすることで多様性を高めることができる。
実際のアルゴリズムと画像に対する処理の流れが以下のようになる。
まずAugmentAndMix関数(2:~14:)について見ていきます。
Step1
画像のmix比の重み を乱数で決める。
公式実装だと以下のようにしてる。
# alpha=1, width=3 ws = np.float32( np.random.dirichlet([alpha] * width)) # 出力例array([0.15282747, 0.6870145 , 0.160158 ], dtype=float32)
widthは3で固定だった。
Step2
i(=[1,2,3])それぞれについてoperationsを3つずつ(op1,op2,op3)ランダムで決める。
ここで言うoperationsとはtranslate_x(x軸方向に画像をずらす)、rotate(回転処理)のような処理を指す。
ちなみに公式実装ではoperationsは以下のリストからランダムに選ばれるようになっていた。
augmentations = [ autocontrast, equalize, posterize, rotate, solarize, shear_x, shear_y, translate_x, translate_y ]
を決めたから全て適用するというわけではなく、
1. だけ適用するか
2. を適用した後さらにを適用するか
3. を適用しを適用した後さらに も適用するか
の3択 [op1,op12,op123]からさらにランダムで1つ決めます。
それらk(=3)個の処理画像をStep1で求めた重みを使ってアルファ合成します。
これにより得た画像を とします。
Step3
ベータ分布 から乱数 を得ます。
を合成比として使用し元画像[tex:x{orig}]と[tex:x{aug}]をアルファ合成します。
以上により得た最終的な画像を とします。
これを返すことでAugmentAndMix関数ができます。
実際には元画像 [tex:x{orig}] に対して2回のAugMix処理をして [tex:x{augmix1}] と の2つの画像を得た後、
通常のLoss(SoftmaxCrossEntropyとか)に加えて以下のようなJensen-Shannon divergenceを加えたLossで評価する。
以上がAugMixの一連の流れになります。
※Jensen-Shannon divergenceについては以下の記事程度の理解です。
http://yusuke-ujitoko.hatenablog.com/entry/2017/05/07/200022
補足 Jensen-Shannon Consistency Lossは、多様な入力範囲に対して、安定性、一貫性をモデルに促すらしい。よく分からんけど。
どうやって有効だと検証した?
上で説明したけどもう一度、
Hendrycks&Dietterichによって提案されたベンチマークで目に見えない崩壊?に対する堅牢性を大幅に改善したらしい。
CIFAR-10-C、CIFAR-100-Cで前のSOTAと Clean Error(壊れてないtestデータに対する通常の分類Error)の差を半分以上縮めたらしい。
(https://twitter.com/balajiln/status/1202764043733229568 より)
AugMixは、予測不確実性の推定も大幅に改善した。 AugMix + Deep Ensemblesは、増加するデータシフトの下でImageNet-CでSOTAキャリブレーションを達成した(Ovadia et al。2019)。 (https://twitter.com/balajiln/status/1202765799636627457 より)
議論はある?
次に読むべき論文は?
Adversarial Examples Improve Image Recognition
分かりづらい解説記事になってしまってすみません...
何か間違いとかあったら指摘してもらえると嬉しいです
Self-training with Noisy Student improves ImageNet classification適当に読んだ
Self-training with Noisy Student improves ImageNet classification
論文リンク:https://arxiv.org/abs/1911.04252
どんなもの?
ディープラーニングは、近年の画像認識で顕著な成功を示しているが最新のモデルは、教師付き学習で訓練されており、適切に機能するにはラベル付き画像の大きなコーパスが必要。
最先端のモデルの精度と堅牢性を向上させるためには、ラベルなし画像も大量に使用するできるようにしたい。
先行研究と比べてどこがすごい?
ImageNetで87.4%のtop1精度を達成した簡単な自己学習方法。
技術や手法のキモはどこ?
step1
ラベル付き画像 { } とし,ラベルなし画像を{ }とする。
step2
ラベル付き画像を使用して、一般の Cross Entropy Loss を使用して教師モデルを学習。
step3
次に、教師モデルを使用して、ラベルなし画像に擬似ラベルをつける。
step4
次に、ラベル付き画像とラベルなし画像の両方の Cross Entropy Loss の合計を最小化するStudentモデルを学習。
この時Studentモデルにはノイズ(RandAugment、Dropout、Stochastic Depth)を加えて学習させる。
step5
最後に、新しい疑似ラベルを生成し、新しいStudentモデルを訓練するために、StudentモデルをTeacherモデルとして戻すことで処理を繰り返す。
どうやって有効だと検証した?
ImageNetで87.4%のtop1精度を達成した。