Yotの日常

趣味の紅茶やエンジニアリングから投資、節約術まであれこれ書いていきます

G検定の振り返り

G検定お疲れ様でした。 今回無事合格させてもらうことができましたので、勉強内容や感じたことなどを共有できたらと思い、こちらの記事を作成しました。

まず私について

  • WebアプリのJavaを主に扱うプログラマー
  • 薬学部出身で学生時代、情報処理などは扱ったことなし。
  • 趣味でKaggleを始めようと思い、Tensorflow, scikit-learnは簡単に触ったことがあり
  • シンプルなNNは、Numpyのみで実装したことがあり、逆伝搬などの数学的な理論は多少把握している

大体、こんな感じです。今回のG検定に向けた勉強前に実装の勉強をしていたことはプラスに働きました。 ただそれは、多少白本の勉強時間を短くできたというくらいの意味しかなかったと思います。

試験の振り返り

多くの方が感じた通り、今回の出題内容は白本などの既存の教材の内容とは大きく異なっていました。 私が受験して感じていた印象は下記のものになります。

  • AIの歴史を聞いてくる問題は非常に少ない
  • 法規制(特にここ10年以内に制定されたもの)、ニュースで取り上げられた社会問題などAIを取り巻くトレンドについて問う時事問題が多い
  • 想像以上に、実装面の知識を聞く問題が多い
  • NN(DL)以外の機械学習についても理論を聞かれた
  • 計算問題があったことが想定外だった

実装面の問題は、CNN、RNN関連が多く、これまでの私の実装経験は全く役に立たなかったです。なので、「白本の勉強時間を短くできたというくらい」の意味しか出なかったですね。。

勉強内容

  • 白本 2周 約10時間

深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト | 浅川 伸一, 江間 有沙, 工藤 郁子, 巣籠 悠輔, 瀬谷 啓介, 松井 孝之, 松尾 豊, 一般社団法人日本ディープラーニング協会 |本 | 通販 | Amazon

以上

G検定のために勉強したことは本当にこれだけだったんですが、私には普段からAI関連のニュースや技術についてのニュースは読む習慣がもともとありました。 ニュースを読んだ際には、新しい技術であれば、合わせてその技術の概要を説明している記事も読むようにしていました。これが非常に大きかったと思います。 以下は、私がよく読んでいたニュースサイトです。

このほかにも、NewsPicks、YahooNewsなどで出てくるAI関連のニュースは意識的に集めていました。法規制やDeepFakeなどの時事問題でニュースを読んでいたことは、とても役にたちました。

当日の準備について

基本的には、何もしてないです。白本片手に、2画面体制での臨んだくらいです。たまに、まとめノートを作られる方や、カンペを用意する方もいますが、私はそういうことはやらなくても良いと思っています。 というのも、白本を勉強して、まとめノートを作った場合、当然まとめノートは要点のみをまとめた詳細の抜け落ちたものになります。 しかしG検定の問題数は200問以上と多く、結果まとめノート外からも多く出題されるでしょう。もし、まとめノートを作った後に、そのノートを中心に勉強してしまうと、全く出題範囲をカバーし切れてないことになってしまいます(白本も全然カバーできてなかったけどね!!!)。加えて、ノートにまとめるのは時間がかかります。その時間があれば、参考書を2周3周勉強する方が、ずっと勉強効率は良いと思います。同じ理由で、これまでどんな試験勉強でもまとめノートを作った経験はほとんどないです。

試験の解き方(進め方)

回答の進め方は、問題を飛ばすということはせず、1問目から順番に解きました。試験中、時間配分は特に気にしていました。全問選択式のテストの場合、最後まで解かないということが一番もったいないからですね。調べないと分からない問題、調べても分からない問題がたくさんありましたが、30分で50問を解くという意識し、必要以上に時間をかけすぎないようには気をつけていました。ただ、もう少し余裕を持って、最後5〜10分を残すペース配分の方がよかったかなと思います。分からないが、調べれば分かりそうな問題番号は控えておき、最後まで回答した後すぐにその問題に戻れる体制は整えていました。

私だったら、こう対策する

最後にもし私が次回、G検定を受けるとしたら、どう臨むのか話していこうと思います。基本的な対策はほとんど変えません。参考書とニュースなどの時事を中心とすると思います。 もし時間に余裕があって、かつここ数年の時事を掲載した参考書が見つからなかった場合だけは、それらをまとめたノートを作るかもしれません。計算問題とか、NN以外からも出題されましたが、一切対策しないと思います。 以下はその理由です。

  • そもそも合格点はどれくらいなのか?

推測でしかないですが、高くても7割5分、今回に関しては6割くらいだったんじゃないかと思っています。

  • その合格点を取るために、どのくらい解ければいいのか?

合格ラインを7割(140問正解)とした場合で考えてみます。G検定の問題は基本的に4択でした。つまり分からない問題もとりあえず回答すれば4分の1は正解します。それを踏まえると、6割(120問)が分かれば、残りの80問のうち4分の1(20問)は回答しておけば当たり、合計で140問正解となります。 つまり、大体6割の問題が分かればいいんじゃないかということになります。

  • では、その6割を正解するために何を勉強すればいいのか?

白本と時事問題の勉強で十分です。計算問題は、いくつかありましたが問題数が少なかったので気にすることはないでしょう。RNN、CNNの理論に関連した難しい問題も、勉強時間と問題数が割に合わないので、G検定に合格したいだけなら、対策の必要はありません。NN以外の機械学習については、さほど深い問題も出ていなかった印象なので、白本でもある程度対応可能と思いますが、気になる方は、一冊機械学習全般の勉強をされるのもいいのではないでしょうか。

ここまでで私のG検定の振り返りは以上になります。最後まで読んでいただき、ありがとうございました。(約1年ぶりにブログ更新しました!)

深層学習をスクラッチで書いていく②〜活性化関数(隠れ層)を実装する〜

こんにちは。Yotです。

では、「深層学習をスクラッチで書いていく」の続きで、今回から実装に入ります。

最初は、記事のタイトル通り、活性化関数を実装していきます。言い忘れていましたが、実装はNumpy配列を使うことを前提にしています。今回の活性化関数の引数もNumpy配列です。

 

まず「活性化関数とは何か?」ですが、一言にまとめると「入力信号の総和を出力信号に変換する関数」になります。

分かりづらいので、噛み砕いて説明していきます。

深層学習は、生物の神経系を模した構造をしています。1つの神経細胞は、複数の神経細胞からの信号を受け取り、1つの信号を送るという働きをしています。

下の図ですと、右下の神経細胞が2つの神経細胞から信号を受け取っていますね。そして、その信号をさらに出力できる信号に変換して、下部の神経細胞へと伝えていきます。この時の受け取った信号を出力する信号に変換する部分が深層学習では活性化関数と呼ばれているものになります。この活性化関数、いくつか種類がありますので、次は簡単な解説を交えながら、実装を紹介していきます。

f:id:yot0201412:20190908110430p:plain

神経細胞

ステップ関数

一番、古典的な活性化関数です。入力の総和がある値を越えるまでは0を出力し、その値を越えると1を返します。生物の神経細胞を活性化の機能をそのまま数式にしたものですね。 実装は下記のようになります。

def step(x):
   return numpy.array(x > 0, dtype='int') 

f:id:yot0201412:20190908125337p:plain

Step関数

このStep関数は、そのほかの関数と比較し、値が不連続であるという特徴を持っています。不連続=滑らかでないという特徴が、学習する際の大きな問題になってきます。詳しくは、ここでは語りませんが、微分可能かどうかという部分が問題になります。

 

シグモイド関数

Step関数同様、値は0から1の間を取ります。Step関数を滑らかにしたものと思ってもらえれば、良いのではないでしょうか。ちなみにこちらの関数も極端な入力だと傾きがほとんどなくなってしまうという欠点があります。

 

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

f:id:yot0201412:20190908132346p:plain

Sigmoid関数


ReLU(Reactified Linear Unit)

こちらの活性化関数は、値が0より大きければ、そのまま入力値を、0以下の場合は0を返すというものです。一般的にSigmoid関数を用いるよりもReLU関数を用いた方が深層学習の精度は上がると言われています。深層学習は、生物の神経系を模したものですが、生物と同じ実装に近づけることが必ずしも正解ではないということの一例らしいです。

def relu(x):
    return np.maximum(0, x)

f:id:yot0201412:20190908133437p:plain

ReLU

 

eLU(Exponential Liner Units)

ReLUの派生形の一つで、入力が0以上の時、xを返すというところがReLUと同じです。

0より小さい場合はe^x -1という値を取ります。多くの場合、ReLUよりeLUの方が学習効率が良く、精度も上がるとのことです。原理は難しいです。。知りたい方は、論文とか読んでください!

def elu(x):
    return np.where( x >= 0, x , np.exp(x) -1)

 

f:id:yot0201412:20190908135124p:plain

eLU関数

まとめ

今回は、隠れ層で使われる活性化関数の実装をまとめてみました。今後の実装では、eLUを使っていきます。次回は、出力層で用いられる活性化関数を実装していきたいと思います。ありがとうございました。

深層学習をスクラッチで書いていく

どうも、こんにちは。Yotです。

 

Tensorflow,Keras,scikit-learnなどなど使って、これまで深層学習をやってましたが、

これから何回かに分けて、深層学習をスクラッチで書いていきます。

 

記念すべき第一回は、実装するもの等を列挙したいと思います。

実装は、次回からです。

 

使うライブラリ

・Numpy

これだけ使わせてください、何卒。

 

学習するもの

アイリスの分類分け。よくあるやつ。

 

実装するもの(予定)

・活性化関数(Sigmoid、Relu、Elu、Softmax)

・損失関数(最小二乗誤差、クロスエントロピー誤差)

・最適化関数(SDG)

・数値微分(、誤差逆伝搬法)

・上4つを使ったモデルクラス

 

それぞれ1個ずつ作成すれば、だいたい大丈夫ですが、せっかくなのでいくつか作って解説していきます。

それでは、次回からは、実装に移っていきたいと思います!

特徴量抽出について

こんにちは。Yotです。

現在、SIGNATEで公開されている某コンペに勉強を兼ねて参加中です。

そのコンペの説明変数の数が大きく、特徴量抽出をしなければとなったので、

調べたことをメモに残しておこうと思います。

 

今回、特徴量抽出を行った理由

・モデルの精度を上げる

・計算量を少なくし、学習時間を短縮

過学習を防ぐ

 

主に上二つの目的が大きいです。

今回のコンペのデータは、各説明変数に名前が与えられていなかったためデータの内容を想像することができず、変数の数が多いことからも、学習に使う変数を何かしらの手法で選択しなければならないと思いました。

 

特徴量抽出方法について

この記事にまとめられていました。

正直、この私の記事読まなくても、ここに飛べば分かる。

aotamasaki.hatenablog.com

 

このコンペは、あるスコア(連続数)を予測するという内容のものだったので、

Piasonの相関分析とANOVAを行いました。

 

相関係数の算出方法

PandasのDataFrame.corr()を使うと簡単に出せます。

戻り値がDataFrameなところも、to_csv()で簡単に出力できて便利です。

計算結果をCSVに出力しておくと、相関係数の値で説明変数をフィルタリングしやすく、再計算も必要ないので、オススメです。

説明変数の組み合わせ全パターンの相関係数を計算しているため、ちょっと計算時間は長かったですが、いずれ参考にするかもしれないので、まあいいかなという感じでした。

pandas.pydata.org

 

ANOVA(分散分析)の算出方法

scipyのstats.f_one_way()を使いました。

前述の通り、説明変数の説明がないため、カテゴリ変数がどれかわからず、

とりあえずone-hotぽいデータ(0か1しかないデータ)に対して行いました。

ただ今回はデータ数が1万を超えているため、p値が低く出やすくあまり参考にはならなかった印象です。

(ランダムにデータを抽出して分散分析しても良いものわからず。。)

 

今回、特徴量抽出してみての感想

説明変数のデータの種類によって抽出方法が違うことは勉強になりました。

また、説明変数を一つづつモデルに追加しながら、予測値の変化を追う手法もあるようで、どこかで試してみたいですね。

ちなみにランダムに500個の説明変数を利用して予測した結果より、相関係数の絶対値が大きなもの200個を利用した予測の方が精度が高く、過学習も抑えられていました。

ただし、まだまだ予測精度が低かったので、特徴量抽出以外にもまだまだ別の前処理していかないとダメそうでした。

続きの話は、区切りがつき次第、別の記事にしていこうと思います。

 

線形回帰のバッチ勾配降下法の勾配ベクトルの導出

このオライリー機械学習の本で現在勉強中。

 

scikit-learnとTensorFlowによる実践機械学習

scikit-learnとTensorFlowによる実践機械学習

 

 

線形回帰のバッチ勾配降下法の勾配ベクトルの計算式の導出方法が載ってなかったので、ここに残しとく。

 

 バッチ勾配降下法について

コスト関数を最小化する為に、パラメータの局所的な勾配を計算し、その勾配分だけパラメータを更新していく方法。例えると、とある山(コスト関数、というかコスト関数の計算結果)を下りたいとする。効率よく下るためには、最も傾斜が急な方向に進めば良い。これをやっているのが、バッチ勾配降下法。そして、この局所的な勾配(足元の斜面の傾き)の求め方が今回の話題、だいたいそんな感じ。

 

では、本題

今回のコスト関数は最小二乗法(MSE)

簡単に説明すると「予測結果と実際の値の差の二乗の平均値」を計算して、これが最小になるパラメータを探す手法。なぜ差の絶対値じゃなくて、二乗なのかとかは、また別の機会に。。(ググれば出てくるよ)

数式にするとこんな感じ。

MSE = 1/ m *\sum_{i=1}^m (θ  * x_{i} - y_{i})^2

m:データの数、θ:パラメータ、x_{i}: 一つのデータセットy_{i}:実測値

 

これを行列式で書き換えるとさらにこうなる。

MSE = 1/ m *|| X θ - y ||^2

今回はこの行列式微分していこうと思います。

 

||  X  θ - y ||^2を変換していく

 まずこの|| X  θ - y ||^2の部分。これはベクトルの内積を表しています。

そのため、このように書き換えることができる。 

||  X * θ - y ||^2 = ( X  θ - y )^T( X  θ - y )

またさらにそれを展開していくとこうなる。

( X  θ - y )^T( X  θ - y ) = ( θ^T X^T  - y^T )( X θ - y )

 =  θ^T X^T X θ - θ^T X^T y - y^T  X θ + y^T y

   =  θ^T X^T X θ -2 y^T  X θ + y^T y  

 

よって、MSEの微分はこのように書くことができる

δMSE/ δθ= 1/m * δ/ δθ( θ^T X^T X θ -2 y^T  X θ + y^T y) 

= 1/m *( δ/ δθ( θ^T X^T X θ) -2δ/ δθ (y^T  X θ) 

 

ここで、

  X θ = Aとおくと、

 δ/ δθ( θ^T X^T X θ)=δ/ δθ(A^T A)

=δA/ δθ ・δ/ δA (A^T A)

=X^T 2A = 2X^TXθ

 

また、

δ/ δθ (y^T  X θ) = (y^T X)^T =  X^T y 

 

よって、

ΔMSE = 2/ m * X^T・(X θ - y)

のようになる。

 

まとめ

行列の微分って慣れないから難しい。

間違えがあったら、指摘お願いします。

 

※分数の書き方汚くて、ごめんなさい。それでもなんとか伝わること信じてます。

届け、この想い。

 

 

ブログ開設しました

こんにちは。Yotです。

こちらでは、私の日常、日々感じたことについて書いていこうかなと思います。

 

まずは、簡単に自己紹介

 

名前:Yot

性別:男(独身)

年齢:29才

趣味:紅茶、フットサル

休日の過ごし方:(起業・独立に向けての)勉強、カフェ

職業:エンジニア

 

給料(=労働)だけに頼らない生活基盤の確立を目指して日々奮闘中です。

投資や節税、節約の話もしていこうと思っているので、そのあたりも注目してもらえると嬉しいです。

 

では、これからよろしくお願いします。

 

Yot