ココアのお勉強ブログ

技術職の一般人です。趣味でコード書いたりソフト触ったり。

半教師あり学習自分用にメモ

教師あり学習について調べようと思ったので、初歩的な手法としてTemporal ensembling、Mean teachers、UNSUPERVISED DATA AUGMENTATION(UDA)、MixMatchについて調べました。
間違いがあったら教えてください。

そもそも半教師あり学習って何?

現実問題、ラベルあり画像(教師ありデータ)を大量に用意することは難しい。
だけどラベルなし画像(教師なしデータ)を用意するのは簡単。
そこで少量の教師ありデータと大量の教師なしデータから学習する手法として半教師あり学習が提案されている。

Temporal Ensembling for Semi-Supervised Learning

arxiv.org

本報告ではΠ-modelとTemporal ensemblingが提案されている。

ここで
x_i:学習データ
y_i:正解ラベル
B:バッチサイズ
t:何エポック目か
w(t):時間に依存する重み。0から始めるramp up 関数 とする。

Π-model

確率的なData Augmentation と 確率的にDropoutの位置を変えるネットワークを用いる。

流れは以下のようになる。

上図にも書いてあるが損失関数は以下のように定義されており、前の項(黄色線)が教師あり損失関数項、後ろの項(赤線)が教師なし損失関数項となる。

アルゴリズム全体

TEMPORAL ENSEMBLING

流れは以下のようになる。

損失関数は先と同じ。
学習後、Z_i←αZ_i+(1−α)z_i を更新することにより、ネットワーク出力z_iがアンサンブル出力Z_iに累積される。

\tilde{z}生成するには、因子 (1−αt) で除算する。

アルゴリズム全体

Mean teachers are better role models:Weight-averaged consistency targets improve semi-supervised deep learning results

arxiv.org

構成と流れは以下の図のようになる。
TeacherモデルとStudentモデルは同じ構造をしている*1

classification cost

SoftmaxCrossEntropyを用いている。

consistency cost

Studentモデルの重みをθ、ノイズをη
Teacherモデルの重みをθ′, ノイズをη′ とすると以下のように書ける。

※この論文ではMSEを使ってるがKL-divergenceなどでも良い。

ちなみにモデルには3つのノイズが入っているが、詳しくは以下のような構成となっており、入力でははRandom Translation、Horizonal flip、Gauusian noiseを、中間層ではDropoutをノイズとして扱っている。

Mean Teacherでは、学習ステップtでのθ′_tを以下の式のようにした。
Teacherモデルの重みはStudentモデルの重みの 指数移動平均(Exponential Moving Average) を用いている。

ここでαはハイパーパラメータ。
確率的勾配降下法(SGD)を用いて各学習ステップでノイズη, η′をサンプリングすることによってconsistency costを近似できる。

総コストは以上2つのコストの加重合計としている(詳しくは以下)。

教師ありデータのとき


教師ありデータが入力にきたとき classification cost と consistency costを求める。
totalcost=classificationcost+w(t)×consistencycost

教師なしデータのとき

教師なしデータが入力にきたとき正解ラベルがなくclassification costを求めることができないため、consistency costのみを用いる。
totalcost=w(t)×consistencycost

こうすることでラベルなし画像もうまく学習に組み込むことができるため半教師学習であると言える。

UNSUPERVISED DATA AUGMENTATION FOR CONSISTENCY TRAINING

arxiv.org

今までは教師なしデータに対して、何かしらの摂動・ノイズ(例えばガウスノイズとかDropoutとか)を加えた。それらをモデルに入力した時の出力が(差の二乗和やKL-divergenceなどを使って)ばらつかないようにするというものであった。
この論文ではガウスノイズやDropoutなどではなく、より現実的なdata augmentationを用いる。

UDAの概略図

RandAugment

RandAugmentについてはよく分からないけど、Data Augmentationを自動で行うAuto Augmentを、学習と同時に行う手法らしい。

他の様々なタイプのノイズも(ガウスノイズ、敵対的ノイズなど)試したが、本手法のようにdata augmentationを用いたらより優れている結果がでたらしい。

MixMatch: A Holistic Approach to Semi-Supervised Learning

arxiv.org

ここでは
バッチサイズをB
教師ありデータをX=( (x_b,p_b) );b\in(1,...,B)
教師なしデータをU=(u_b);b\in(1,...,B)
とします。

step1

ラベルあり画像(教師ありデータ)x_bに対してdata augmentation(ランダム水平反転処理やランダムクロップ処理など)を行い新たな画像\hat{x}_bを作る。

step2

同様にラベルなし画像(教師なしデータ)u_bに対してもdata augmentationを行い新たな画像を作る。
ラベルなし画像をdata augmentationする時、K回行いK個の新たな画像\hat{u}_{b,k};k\in(1,...,K)を作る。

step3

step2で生成したdata augmentation後のラベルなし画像に対して、モデルでラベルを予測する。
data augmentation後のラベルなし画像はK個あるので、K個分モデルで予測することになる。

step4

step3の予測値を平均する。

これで得られる値を  \bar{q}_bとする。

step5

step4で出力した平均値をSharpen(エントロピーを小さく)する。
TはハイパーパラメータでT→0でonehotに近づくようになっている。

これにより得られる値をq_bとする。
q_b=Sharpen(\bar{q}_b,T)

step6

以下のようにラベルありデータは(画像,ラベル)のペア\hat{X}にする。
\hat{X}=( (\hat{x}_b,p_b ) );b\in(1,...,B)

以下のようにラベルなしデータは(画像,疑似ラベル)のペア\hat{U}にする。
\hat{U}=( (\hat{u}_{b,k},q_b) );b\in(1,...,B),k\in(1,...,K)

step7

ラベルありデータとラベルなしデータそれぞれをMixupする。
合成するデータはラベルありデータでもラベルなしデータでも良い。

これにより得られる合成後のラベルありデータを X' 、合成語のラベルなしデータを U'とする。

step8

(合成後の)ラベルありデータ x の予測値と(合成後の)正解ラベル p に対し、CrossEntropyを計算する(ラベルありデータの損失関数項)。
(合成後の)ラベルなしデータ u の予測値と(合成後の)生成したラベル qとの差の二乗和を計算する(ラベルなしデータの損失関数項)。
そしてそれぞれを加算し、損失関数とする。

ここで
λ_uはハイパーパラメータ
Lpの次元数
とする。

step9

step1~step8を繰り返して学習を行う。

MixMatchアルゴリズム

step1~step7をまとめると以下のようになる。

ReMixMatch

最近これの進化系ReMixMatchという論文が出たらしいです。
以下の記事が非常に詳しく書いていたのでここでは解説は省きます。

qiita.com

自分用用語メモ

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では潜在変数を用いる。  (a,z_b) (b,z_a) のペアのマッピングを学習させる(潜在変数の推論を行う)。

Let Z be a latent space with a standard Gaussian prior p(z) over its elements.

 (a,z_b) (\tilde{b},\tilde{z}_a)マッピングを行い、
以下の損失関数(論文ではMarginal Matching Lossと呼んでいる)に入れる

さらに以下のようにマッピングを行い

以下の Cycle-consistency lossに入れる。

逆の変換も同様に行う。

最終的には以下の損失関数を最適化することになる。

\gamma_1\gamma_2 はハイパーパラメーター

どうやって有効だと検証した?

議論はある?

次に読むべき論文は?

参考

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でもイラストを描けるようになり,ipadApple 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)を使っています。色は黒です。

髪の毛のパターンとかどうすればええねん...ってなりますが基本的に色んな参考絵の髪のパターンを組み合わせて丸パクリ感を消していきます(今回関係ないけど服のシワパターンもそんな感じ)。弊研だとアンサンブルでやるって言えば理解できるかな。

髪はつむじから流れを意識して描きます。また元のラフより少し離して描きます。

塗る(これは見なくていい)

「!?」と思ったかもしれませんが自分が塗るとこんな感じです。いきなりこの塗りに挑戦しようとすると難しいので誰でも簡単にできる塗りを紹介しようと思います。

塗り講座

さっきまでのイラストと同じような工程で以下の線画を描きました。

こっから色塗りに入りますがその前にレイヤーについて理解しておいてください。
* レイヤーについて

乗算レイヤーという合成レイヤーを使って塗る初心者向けのアプローチで塗ります。
ざっくり以下のリンクを見てください。
* 乗算で影を塗る

↓新しいレイヤーを線画レイヤーの下に作ってグレーで影を描きます。 影を描いた後、影を描いたレイヤーブレンドを乗算レイヤーにして下さい。

↓新しいレイヤーをさらに線画レイヤーの下に作って下塗りを描きます。

目を塗る

※目だけに塗りを適用したいときクリッピング機能が役に立ちます
クリッピング機能について

↓目の下らへんにオレンジ追加

↓グラデーション(黒)

↓瞳(黄色)

↓ハイライト(白)

髪にハイライトをつける

顔に赤をのせる

それっぽいの完成

もうワンステップレベルを上げた塗り

先程の塗りでも十分良いのですが、グラデーションを使ってもっと塗りを良くします。

できました!

他にもテクスチャを使って水彩っぽくする技術もあるのでもしよかったら以下の記事読んでください。
アニメ塗りを水彩画風にする

hotcocoastudy.hatenablog.jp

あとがき

最近初心者でも気軽にイラストが描けるようになりました。
↓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比の重み w_k を乱数で決める。

公式実装だと以下のようにしてる。

# 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
]

op_1,op_2,op_3 を決めたから全て適用するというわけではなく、
1. op_1だけ適用するか
2. op_1を適用した後さらにop_2を適用するか
3. op_1を適用しop_2を適用した後さらに op_3も適用するか

の3択 [op1,op12,op123]からさらにランダムで1つ決めます。

f:id:hotcocoastudy:20191207144419p:plain

それらk(=3)個の処理画像をStep1で求めた重みを使ってアルファ合成します。

これにより得た画像を x_{aug} とします。

Step3

ベータ分布 Beta(β,β)から乱数 mを得ます。

mを合成比として使用し元画像[tex:x{orig}]と[tex:x{aug}]をアルファ合成します。

以上により得た最終的な画像を  x_{augmix} とします。
これを返すことでAugmentAndMix関数ができます。

実際には元画像 [tex:x{orig}] に対して2回のAugMix処理をして [tex:x{augmix1}] と x_{augmix2}の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

ラベル付き画像 {(x_1,y_1),(x_2,y_2),(x_n,y_n) } とし,ラベルなし画像を{ x_1,x_2,...,x_m }とする。

step2

ラベル付き画像を使用して、一般の Cross Entropy Loss を使用して教師モデルを学習。

step3

次に、教師モデルを使用して、ラベルなし画像に擬似ラベルをつける。

step4

次に、ラベル付き画像とラベルなし画像の両方の Cross Entropy Loss の合計を最小化するStudentモデルを学習。
この時Studentモデルにはノイズ(RandAugment、Dropout、Stochastic Depth)を加えて学習させる。

step5

最後に、新しい疑似ラベルを生成し、新しいStudentモデルを訓練するために、StudentモデルをTeacherモデルとして戻すことで処理を繰り返す。

どうやって有効だと検証した?

ImageNetで87.4%のtop1精度を達成した。

議論はある?

次に読むべき論文は?