Fast AI 2018 Lesson 4 後半

Fast aiのライブラリによる自然言語処理

タスク

  • 映画レビューのセンチメント分析
    • 入力:映画のレビュー文章
    • 出力:文章がPositiveかNegativeか

データセット

  • IMDBの映画レビュー
    • サイズ
      • 50000件
    • Attribute
      • レビューの文章
      • 1-10のスコア(4以下で否定的なレビュー、それ以上で肯定的なレビューとみなす)

モデリングの流れ

  1. 英語を理解する言語モデルを作成
  2. 上記のモデルをファインチューニングし、(入力:レビュー文章、出力:ラベル)となるようなモデルを作成

なぜ直接本題である2番目のタスクを直接解かずに1を経由するのか?

→ こちらのほうが効率的だから、とのこと。言語もわからないままある文字列について感情分析するよりも、言語を理解してから感情分析をするほうが遥かに早いということ。

さて、上記のステップ1, 2をpythonコードで示す。

1. 英語を理解する言語モデルを作成

テキストの前処理の方法を記述

import torchtext
from torchtext import vocab, data
from torchtext.datasets import language_modeling

# lower=true テキストをLowerCaseにする
# tokenize="spacy" トークナイザの指定
TEXT = data.Field(lower=True, tokenize="spacy")

ModelDataの作成

PATH = 'data/aclImdb/'
TRN_PATH = 'train/all/'
VAL_PATH = 'test/all/'
TRN = f'{PATH}{TRN_PATH}'
VAL = f'{PATH}{VAL_PATH}'

# バッチサイズ    
bs=64 
# Back prop through time
bptt=70 
FILES = dict(train=TRN_PATH, validation=VAL_PATH, test=VAL_PATH)
    
md = LanguageModelData.from_text_files(PATH, TEXT, **FILES, bs=bs, 
                                           bptt=bptt, min_freq=10)

ModelDataの作成後、TEXT変数にはテキスト内のユニークな単語の集合が格納される。また各単語は整数値へとマッピングされる。

各種パラメタの設定

em_sz = 200  # 各単語のEmbeddingのベクトルの長さ
nh = 500     # レイヤー毎の隠れ層の数
nl = 3       # レイヤー数

テーブルデータのカテゴリー値の学習時と同様に、単語についてEmbedding行列を作る。テーブルデータ時の学習時にはEmbeddingベクトルの長さの最大は50としていたが、今回はそれよりも大きな200としている。これは、Sundayのようなカテゴリー値よりも単語はずっと多くのニュアンスを含んでいるため。 通常、50-600のサイズを選ぶことが多い。

最適化関数の指定

opt_fn = partial(optim.Adam, betas=(0.7, 0.99))

NLPのタスクでは最適化関数にAdamを用いることが多く、今回もそれに則る。 betasに指定しているパラメータはモメンタムと呼ばれる。NLPのタスクではデフォルトの値(0.9)よりも小さい値でうまくいくことが多いそう。 これらについては次回の講義で説明される。

Learnerオブジェクトを作成・フィッティング

learner = md.get_model(opt_fn, em_sz, nh, nl, dropouti=0.05,
                           dropout=0.05, wdrop=0.1, dropoute=0.02, 
                           dropouth=0.05)
learner.reg_fn = partial(seq2seq_reg, alpha=2, beta=1)
learner.clip=0.3
  • 上記のドロップアウトに関するパラメータがいくつもあるが、詳しい説明は後半の講義で語るということで割愛されていた。過学習気味ならばこれらの値をまとめて大きく、反対に未学習傾向にあるならこれらの値を小さくすればよい、とのこと。
  • reg_fnも同様の理由で詳しい説明はないが、今の段階では過学習を抑えるためのおまじない、という認識でよいとのこと。
  • clipは一度に更新される重みの最大値を指定している。これにより一度の更新で重みが大幅に更新されて重みが収束しなくなるのを防ぐことができる。
learner.fit(3e-3, 4, wds=1e-6, cycle_len=1, cycle_mult=2)
learner.save_encoder('adam1_enc')
learner.fit(3e-3, 4, wds=1e-6, cycle_len=10, 
            cycle_save_name='adam3_10')
learner.save_encoder('adam3_10_enc')
learner.fit(3e-3, 1, wds=1e-6, cycle_len=20, 
            cycle_save_name='adam3_20')
learner.load_cycle('adam3_20',0)

learner.save_encoder('adam3_20_enc')
learner.load_encoder('adam3_20_enc')

いつもと同じようにSGDRでの最適化を行う。

2. 1のモデルを今回のタスク用にファインチューニングする

データの前処理・読み込み

# 元のモデルと同じテキストの集合・整数マッピングを用いる
TEXT = pickle.load(open(f'{PATH}models/TEXT.pkl','rb'))
# 
IMDB_LABEL = data.Field(sequential=False)

splits = torchtext.datasets.IMDB.splits(TEXT, IMDB_LABEL, 'data/')
md2 = TextData.from_splits(PATH, splits, bs)
  • splits pytorchの訓練データ
  • TextData.from_splitsfast aiのライブラリでsplitからそのままDataModelオブジェクトを生成できる

ファインチューニング

Differential Learning Rateを指定したり、最後の層以外を固定し学習→仕上げに全層を学習、と今までと同様の方法で行う。

m3.clip=25.
lrs=np.array([1e-4,1e-3,1e-2])
m3.freeze_to(-1)
m3.fit(lrs/2, 1, metrics=[accuracy])
m3.unfreeze()
m3.fit(lrs, 1, metrics=[accuracy], cycle_len=1)

結果

m3.fit(lrs, 7, metrics=[accuracy], cycle_len=2, 
       cycle_save_name='imdb2')
m3.load_cycle('imdb2', 4)
accuracy(*m3.predict_with_targs())
=> 0.94310897435897434

Fast AI 2018 Lesson 4 前半

講義資料

  • 講義動画

Deep Learning For Coders—36 hours of lessons for free

 

  • 対応ノート(Kernel)

fast.ai lesson 3 | Kaggle

 

学んだこと

Dropoutによる過学習の抑制

Dropoutとは、一定確率でActivationの結果を捨て去り無視して次の層の計算を行う方法のこと。 これにより、過学習を防ぐことが期待できる。

learn = ConvLearner.pretrained(arch, data, ps=0.5,
            precompute=True, xtra_fc=[512]);

上記のようにp=0.5 とした場合、50%の確率で各Activationの計算結果は無視される。また上記の記述方法だと全ての層のドロップアウトの確率が0.5になるが、以下のように

learn = ConvLearner.pretrained(arch, data, ps=[0.2, 0.5],
            precompute=True, xtra_fc=[512]);

層ごとにドロップアウトの率を変えることも可能である。

pの値の設定方法として、最初は予め適当な数字(0.5など)を設定し、学習後、過学習しているとわかったらpを上げる、学習が不十分だった場合はpを下げればよい。

Structured DataのDeep Learning

前置き

Structured Dataとは

 以下の要素の組み合わせからなるデータ。

  • 連続値   (商品の価格、レビューの評価など)
  • カテゴリ値 (商品のジャンル、色など)

データベースの行と列を想像するとよい。

cat_vars = ['Store', 'DayOfWeek', 'Year', 'Month', 'Day', 'StateHoliday', 'CompetitionMonthsOpen',
    'Promo2Weeks', 'StoreType', 'Assortment', 'PromoInterval', 'CompetitionOpenSinceYear', 'Promo2SinceYear',
    'State', 'Week', 'Events', 'Promo_fw', 'Promo_bw', 'StateHoliday_fw', 'StateHoliday_bw',
    'SchoolHoliday_fw', 'SchoolHoliday_bw']

contin_vars = ['CompetitionDistance', 'Max_TemperatureC', 'Mean_TemperatureC', 'Min_TemperatureC',
   'Max_Humidity', 'Mean_Humidity', 'Min_Humidity', 'Max_Wind_SpeedKm_h', 
   'Mean_Wind_SpeedKm_h', 'CloudCover', 'trend', 'trend_DE',
   'AfterStateHoliday', 'BeforeStateHoliday', 'Promo', 'SchoolHoliday']

タスク

ある一つのカラムの値(y)を他のカラムの値(x1, ... xn)から予測するというタスクを考える。 今回のデータセットでは売上値'Sales'の値を他のカラムの値から予測する。

処理の流れ

データの前処理

joinedはpandasのデータフレーム

df, y, nas, mapper = proc_df(joined, 'Sales', do_scale=True)
yl = np.log(y)

proc_dfはfast aiのutil関数で以下のことを一度に行ってくれる。

  • データフレームから目的変数と説明変数を切り離す

  返り値のうち、dfは目的変数('Sales')を除いたデータフレーム。yは目的変数('Sales')の列

  • データの正規化(do_scale=True)

  各値を平均 0, 標準偏差1になるように正規化

  • 欠損値の処理

カテゴリ値に対する特殊な処理

説明変数が全て連続値ならば問題ないが、カテゴリ値が含まれてる場合、Embeddingという特殊な処理が必要になる。

Embedding

カテゴリ値をベクトルで表現し、置き換える方法。 例えば、カテゴリ値がWeekOfDay'だったら、 以下のような行列(7*4)を用意し、 f:id:daikonclover:20190116194125p:plain 各カテゴリ値にベクトルを対応させる、といった具合である。 このような行列をembedding matrixという。

e.g.)

Monday => (0.4, 0.2, 0.3, 0.1)

Sunday => (0.5, 0.1, 0.5, 0.5)

これらの行列の実態は重み行列で、学習時にこれらの値は更新されていくことになる。よってこれらの初期値は重要ではない。 行のサイズはカテゴリ集合の大きさ(この例では7)に一致するが、列のサイズは任意である。 経験則的に、以下のように

cat_sz = [(c, len(joined_samp[c].cat.categories)+1) for c in cat_vars]
emb_szs = [(c, min(50, (c+1)//2)) for _,c in cat_sz]

カテゴリ集合の大きさの半分、もしくは50のどちらか小さい方を選ぶようである。

学習時の流れ

実際の学習時では、 input => (カテゴリ値の部分をembedding matrixを参照してベクトルに置換) => Leaner Layer => ...(some layers) => Output

といった流れになる。

モデルの作成

上記のEmbedinngの作業は、fast aiのライブラリにカテゴリ値に関する情報(フィールド名、エンベディングのサイズ)を指定するだけでよしなに行ってくれる。

#
md = _ColumnarModelData.from_data_frame(PATH, val_idx, df, yl.astype(np.float32), cat_flds=cat_vars, bs=128,
                                       test_df=df_test, is_reg=True)
#引数: 各カテゴリ値のEmbeddingのサイズ, 連続値カラムの数, Embedding Matrixのドロップアウト, アウトプットの数, 各レイヤーの隠れ層の数, 各レイヤーのドロップアウト, y_range(おまじない)
m = md.get_learner(emb_szs, len(df.columns)-len(cat_vars),
                   0.04, 1, [1000,500], [0.001,0.01], y_range=y_range)

あとは普段どおりに行う

lr = 1e-3
m.fit(lr, 1, metrics=[exp_rmspe])
m.fit(lr, 3, metrics=[exp_rmspe])
m.fit(lr, 3, metrics=[exp_rmspe], cycle_len=1)

metrics=[exp_rmspe]はこのコンペで指定されていた評価関数。以下のように定義されている。

def inv_y(a): return np.exp(a)

def exp_rmspe(y_pred, targ):
    targ = inv_y(targ)
    pct_var = (targ - inv_y(y_pred))/targ
    return math.sqrt((pct_var**2).mean())

Fast AI 2018 Lesson 3

講義資料

  • 講義動画 

Deep Learning For Coders—36 hours of lessons for free

  • 対応ノート(Kernel)

fast.ai lesson 2 | Kaggle

学んだこと

CNNの仕組み

CNNは以下の畳み込み層とプーリング層の組み合わせと、それらの出力を結合する全結合層からなる。全結合層では畳み込み層とプーリング層の組み合わせによる出力画像を入力として受け取り、入力画像と同じサイズの重み行列を掛け合わせる。

畳み込み層

入力画像に対し、filterと呼ばれる入力画像よりも小さな行列を適用し、新たに画像を生成する層。

  • 入力: Kチャネルの画像(サイズはn*n)

  • フィルタ: m種類のK次元のh*hの行列

  • 出力: mチャネルの画像

フィルタは以下のように、画像の一部分に対して適用する。計算が終わったら列を1つずらして、再びフィルタの適用を行う。この時、ずらす列は必ずしも1でなくてもよいが、講義では1で説明していた。このパラメータをstride(ストライド)という。

以下で(入力: 1チャネルの画像 2828,フィルタ: 2種類の33行列, 出力: 2チャネルの画像)での計算の例をとりあげる。

f:id:daikonclover:20181231145744p:plain
左から順に入力、フィルタ、出力を表す。ここでは出力画像の[0,0]部分の計算を示している

f:id:daikonclover:20181231145903p:plain
計算対象を1列ずらし、出力画像[0, 1]の行列計算を行う

このように計算を続けていくことで、右図のような出力画像ができあがる。 もう1種類のフィルタに対しても同様の計算を行い、最終的に以下のような2チャネルの画像が出力となる。

f:id:daikonclover:20181231150151p:plain
左から順に1チャネルの入力画像、2種類のフィルタ、2チャネルの出力画像

また、出力時には活性化関数としてReLU(Rectified Linear Units)が使われる。 これは、正の値に対しては恒等関数と同じ働きをし、負の値を0にして返す関数である。実装は以下のような単純なものである。

def relu(x)
  return max(0, x)

プーリング層 

畳み込み層の後に置かれる。画像を入力として受け取り、それを要約した画像を出力する。

畳み込みと同様に画像内の小さなブロックを計算対象にとり、それらの中の代表値を出力とする。代表値の計算方法は、平均値など様々な方法が考えられるが、最大値を代表値とすることが多い。これはMAXプーリングと呼ばれる。

f:id:daikonclover:20181231151713p:plain
入力画像中のn*n(n=2)ブロックを1つの値に要約
畳み込み層と同様に、ストライドの値を決定する必要がある。上記の例では2となっている。

プーリング層の利点として、

  • 代表値を用いるため、 学習時の画像の特徴の位置と推論時の画像の特徴の位置が多少ずれていても判別可能になる
  • 計算量が減る 

などが挙げられる。

衛生画像を題材とした多ラベル分類器の構築

画像を入力として受け取り、その画像のラベルを複数出力するようなネットワークを構築する。

例) 入力: ある衛星画像 → 出力: ラベル[晴れ、川、森林]

fast aiのライブラリは、訓練データに正解の情報がラベル付けされていると、自動的に多ラベル分類器としてモデリングしてくれるため、前回の犬猫の分類器とほぼ同じ方法を用いることができるが、パラメータにわずかな違いがある。

FineTuningにやや不向きなデータセットでの学習方法

前回と同様、FineTuningでモデルを構築していくことになるが、ベースとなる学習済みモデルが学習時に使った画像と今回の学習データである衛生画像は少しかけ離れており、低レイヤー層の再利用性は犬と猫の分類の時ほど高くはない。

しかし、それでもある程度は再利用が可能のようで、Differential Learning Rateの縮小率を前回の10倍ではなく、3倍として、低レイヤー層の学習率を高めにとり再学習することで十分動くモデルが作れるようである。

以下は講義内で用いられたコード。構成は犬と猫の分類器と同じ。

# 全結合層を学習
lr = 0.2
learn.fit(lr, 3, cycle_len=1, cycle_mult=2)

# 全結合層以外の固定を解除し、学習
lrs = np.array([lr/9, lr/3, lr]) # 低レイヤーの学習率も高め
learn.unfreeze()
learn.fit(lrs, 3, cycle_len=1, cycle_mult=2)

大幅に学習しなおす必要がある低レイヤーを固定して、全結合層のみ事前に学習する理由として、やらないよりマシ(Better than nothing)、程度のことであった(多少は再利用性があるため)。これをすることで2回目の学習をやや効率的に行うことができる。

全結合層での活性化関数について

犬と猫の分類器と今回のモデルで大きく異なる点は、全結合層の活性化関数である。犬と猫の分類器のような出力が1つのラベルの分類器ではソフトマックス関数を用いられる。

ソフトマックス関数の性質

  • 実数値を入力とし、[0, 1]の範囲の値を出力する
  • 全てのラベルについての出力を足し合わせると1になる

全ての出力を足し合わせると1になる、という制約上、複数の値が大きな値を取りづらくなり、1つのラベルを分類する際には都合がよい関数となっている。

一方、似たような関数にシグモイド関数がある。

シグモイド関数の性質

  • 実数値を入力とし、[0, 1]の範囲の値を出力する

こちらは、ソフトマックス関数と異なり合計が1になるという制約はついていない。そのため、複数のラベルに対しても大きい値を出力することができ、多ラベル分類には都合がよい。

f:id:daikonclover:20181231163058p:plain
softmaxでは1つのラベルのみ大きい値を取っているが、sigmoidでは複数の値が大きい値を取ることができる

以上のように今回のケースではシグモイド関数を出力層の活性化関数とする必要があるが、最初に述べたように訓練データが多ラベルを持っている場合、fast aiのライブラリは自動的に適切な活性化関数を選択してくれているため、クライアント側では特に何かする必要はない。

Fast AI 2018 Lesson 2

講義資料

  • 講義動画 

Deep Learning For Coders—36 hours of lessons for free

  • 対応ノート(Kernel)

fast.ai lesson 1 | Kaggle

学んだこと

モデル学習時のテクニック

FineTuning

既存の学習済みのモデルを元に新たなモデルを構築する手法。今回の講義の構築するモデルの肝。 既存のモデルの最後の層以外の重みを固定して、最後の層の重みのみを新たなデータセットで学習する。 f:id:daikonclover:20181222210014p:plain

利点
  • 一から学習する場合と比べて、学習データが少なくても精度のよいモデルを作れる可能性がある
  • 学習データが少ない && 学習層が少ないので、学習に時間がかからない
欠点
  • 新たに学習するデータと元のモデルに使われた学習データがあまりにもかけ離れていると、効果は得られない可能性が高い。

うまくいく例

元の学習データ: 人の手で取った写真(ライオン、キリン)

新たに入力するデータ: 人の手で取った写真(犬、猫)

うまくいかない例

元の学習データ: CTスキャンの画像

新たに入力するデータ: 人の手で取った写真(犬、猫)

なぜこの手法が成立するのか?

高次の層にいくにつれて、画像の具体的な部分を学習するようになるが、 低次の層は、どの画像にも共通するような要素を学習しているので、使い回しが可能だから、とのこと。

f:id:daikonclover:20181222210942p:plain
低レイヤー: どの画像にも共通する部分を学習(物体の縁?)
f:id:daikonclover:20181222211127p:plain
高レイヤー: ある画像の具体的な部位を学習(再利用性は低い)

最適なLearning Rateの決定方法

Learning Rateは小さすぎると学習が終わらないが、大きすぎても発散してしまうので、適切な値を見つける必要がある。fast aiのライブラリのlr_findを用いることで最適な値を得ることができる。 この値は、loss値をlearning rateで微分した値が最小となる値を指す。

f:id:daikonclover:20181222211646p:plain
この場合は、接戦の負の傾きが最大になっている10^-2付近が最適な学習率となる

Learning Rateを学習時に動的に変更する

上記の方法で効率のよい学習率を見つけることはできるが、どうしても学習が進んでいくと、後半は値が収束しなくなってしまう。 より正確な重みの値を得るためには、局所解に近づくにつれ徐々に学習率を小さくしていきたい、という発想になる。

cos アニーリング

先程の方法で見つけた値を初期値として、学習を進めるにつれて、cos関数に従って徐々に値を減らしていく。 f:id:daikonclover:20181222213441p:plain

リスタート

より厳密な解を得やすくなったが、一度局所解の方向を見つけると、抜け出せなくなる可能性が高くなるということになる。これの問題点として、目的関数が以下のような場合、f:id:daikonclover:20181223054629p:plain

右側の谷底よりも左側の谷底の方がより優れた解であるといえる。 (異なるデータセットを投入して、例えばこのグラフが左右にずれた場合、右の解では最適な値でなくなってしまう、とのこと)

これは、定期的に減衰した学習率をリセットするとことで右側のような局所解にはまる可能性を減らすことができる。 リセットするタイミングは1つ、またはいくつかのエポックが終わる毎でよい。

f:id:daikonclover:20181222213254p:plain
各エポック毎にリセット
f:id:daikonclover:20181222213313p:plain
1エポック、3エポック、7エポック目が終わる度にリセット

Data Augmentation

学習用のデータを拡張(ここでは画像の反転、拡大・宿所、明るさの変更など)することによって、学習データを増やし、精度向上に役立てるというもの。 動画では、各エポック毎に拡張したデータを投入することで精度向上につながると紹介されていた。

f:id:daikonclover:20181222213524p:plain
左列: 1エポック目、中央: 2エポック目, 右列: 3エポック目

Differential Learning Rate

各層ごとに異なる学習率を採用する方法。 FineTuningで学習済みのモデルを元に新たな構築する際、 学習済みの低レイヤー層を固定するのではなく、高次のレイヤーと比べて小さい学習率を指定して再学習し、重みを微調整するのに用いられる。こうすることで、層を固定した場合よりも高い精度が得られる。

学習率は後ろの層にいくにつれて、3-10倍になっていくように設計するとよい。

eg.) 1層目: 10 ^ -4, 2層目: 10 ^ -3, 3層目: 10 ^ -2

推論時のテクニック

構築済みのモデルに変更を加えずに、推論時に工夫を加えることによって精度を上げる

TTA (TestTimeAugumentation)

モデルに入力画像を投入する前に、Data Augumentationを行い、拡張後のデータそれぞれを推論し、それらの平均を出力とする方法。1枚の画像の場合と比べて、出力が安定する可能性がある。簡単な手法だが、結構効果があるそう。

fast aiのライブラリにはTTAを行うためのメソッドが用意されている

# learnは学習済みのモデルのオブジェクト
log_preds, y = learn.TTA()

TTAなしの場合

入力(判別したい画像)→モデル→推論値(出力)

TTAありの場合

入力(判別したい画像)→拡張データ [入力1,入力2, ..., 入力n] → モデル→ [推論値1, 推論値2, 推論値n] → 推論値の平均(出力)

分析時のテクニック

Confusion Matrix

実際のラベル(縦軸)が推論時にどのラベル(横軸)に分類されたかをひと目で判断できる。対角線上の値が正しく分類できた場合の数。 f:id:daikonclover:20181222201526p:plain

State of the artの画像判別モデルの構築手順

上記のテクニックを駆使することで簡単に高精度のモデルを構築できる。 以下は今回の講義で紹介されていた方法のまとめ。

1 既存のモデルをベースに、最後の層のみ学習を行う。

arch=resnet34 # ベースとなるモデル
sz = 224 # 画像のサイズ
# データ拡張を行うための記述
tfms = tfms_from_model(resnet34, sz, aug_tfms=transforms_side_on, max_zoom=1.1)
data = ImageClassifierData.from_paths(PATH, tfms=tfms)
 # precompute = Trueで最後の層以外を固定
learn = ConvLearner.pretrained(arch, data, precompute=True)

#最適な学習率の初期値を計算
lrf=learn.lr_find()

#学習(エポック数は2-3でよい)
# cycle_lenはエポック毎にアニーリングとリスタートをするためのパラメータ
learn.fit(1e-2, 2, cycle_len=1)

2 仕上げとして低レイヤー層を固定化せず、全層を学習しなおす

#固定を解除
learn.unfreeze()
# Differential Leaning Rate
diff_lr=np.array([1e-4, 1e-3, 1e-2])
learn.fit(diff_lr, 3, cycle_len=1)

Fast AI 2018 Lesson 1

はじめに

数ヶ月前にKaggle Kernel上でFast AIの教材を使って学べるようになったという話を聞いて、 はじめてみることにしました。今までは自分お金を払ってサーバーを借りて学習環境をセットアップする必要があったので無料の学習サービスといえど、やっかいな点だったので、これは嬉しい。

第1回講義資料

  • 講義動画 

Deep Learning For Coders—36 hours of lessons for free

  • 対応ノート(Kernel)

fast.ai lesson 1 | Kaggle

講義動画はyoutubeからでも見れるが、fast aiのページにはその回の講義に関する情報も記載されているから必ずそちらから見るようにとのこと。

講義の題材

犬と猫の画像分類器の実装

今回学んだこと

各種ツールの使い方

  • Jupiter Note Book
  • 各種ライブラリ(Numpy, FastAI独自ライブラリ) FastAI独自のライブラリはPyTorchをベースに作られていて、講義の後半ではPyTorchについても触れていくとのこと。

fast aiの学習アプローチについて

 トップダウン方式

学習者のモチベーションを保つために始めにコード駆動で(半ばブラックボックス化された)ライブラリを用いて概形を掴んだあとに、 その都度必要な知識を学んでいく

Deep Learningの(かなり)雑な理解

  • Deep Learningでは線形層と非線形層が組み合わさることによって柔軟な関数を作ることができる
  • パラメータチューニングの勾配降下で行う

    • 式のイメージは x' = x - dy/dx * (learning_rate)で 関数の値が減っていく方向に徐々にxの値を動かしていき、局所解を見つけに行く
    • learning_rateはハイパーパラメータで学習の速度を決める。大きすぎると学習スピードは早いが収束しなくなってしまう。小さすぎると今度は学習が終わらなくなってしまう。learn.lr_find()というfast aiのライブラリを使うと、ある程度よしなに決定してくれるようである。(論文で発表された効果的なlearning_rateの決定方法が実装されてある。)
  • もう1つのハイパーパラメータ epock数について  - 訓練データに対して何回学習を行うか、を決める数

    • この値は正直なんでもよいが、以下の理由からおのずと数は限られてくる
      • あまり大きいと過学習を起こす
      • そもそものデータ数が多いと学習が終わらなくなったりする

感想

初回ということもあって、技術的なことに関しては終始ざっくりとした説明であった。(題材の画像分類器の実装自体はライブラリのコードを使って3行で終えている)。 ただ、トップダウン方式のアプローチにもあるようにこれから深掘りされていくと思うと楽しみ。 次回の講義では今回の画像認識手法が通用しないようなトピックを扱って、新たに知識を得ていくそう。

Kaggle Kernel上でFast AIの教材を使って学べるそうなので始めてみる

はじめに

Fast AIがkaggleのkernel に対応した、ということを聞いてはじめることにしました。 回ごとに学んだこと、感想などをまとめていきたいと思います。

Fast AIとは

コーダーのためのディープラーニング無料の学習サイト(英語)である。 特徴は、既に実装済みのライブラリのコードをJupiterNoteBook上で動かしながら概形を把握し、 その後実装の内部に触れていくというトップダウン方式の学習方式をとっている。 トップダウンの方式を取ることで、モチベーションを保ちつつ、学習を進めていくことができる、とのこと。 学習の進め方は、講義の動画を見ながら手元のJupiterNoteBookを動かしていく、という感じ。

今まではGPUが使えるサーバーを借りて学習環境(Jupiter Notebook)を作る必要があったため、 セットアップにはひと手間必要だったが数ヶ月前にFast AIがKaggle Kernel上で動くようになった。

Kaggle Kernelとは

Kaggleが提供しているブラウザ上でpythonのコードを動かすことができる環境。Githubのようにそこに記述したコードのバージョニングをしたり、他の人たちと共有できるようになっている。今回Fast AIが使えるようになったのも、この共有機能のため。

KernelでFast AI使えると嬉しいところ

  • GPU環境が無料で使える
  • DeepLearning用のパッケージ等が既に環境にインストールされているので設定が楽
  • Kaggle Competitionのデータのアクセスが簡単

3番目について補足すると、Kaggleとはそもそもデータサイエンティストの集うコミュニティサイトで特に、企業によるコンペが盛ん。 企業はコンペのために訓練用データを提供してくれていて、Fast AIで学んだアプローチをこれらデータに適用して理解を深めたり、また実際のコンペの問題を解いたりすることができる。

Fast AIコースマップ

全7回

Deep Learning For Coders—36 hours of lessons for free

1: Recognizing cats and dogs 2: Improving your image classifier 3: Understanding convolutions 4: Structured, time series, &language models 5: Collaborative filtering. Inside the training loop 6: Interpreting embeddings. RNNs from scratch 7: Resnets from scratch