Enjoy Engineer Life

C#,Unity,C++,UE4などの技術ブログや雑記を徒然なるままに書いていきます。

【読書メモ】Deep Learningを学ぶ〜ニューラルネットワークで主に使用されるReLU関数とは〜Part 9

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain



今回は「ReLU」という関数について学んでいきます。

ReLUとは

最近のニューラルネットワークでは「ReLU(Rectified Linear Unit)」という関数が主に使用されています。


ReLU関数の特徴として、「最低値は0、それ以上ならそのまま出力を行う」というものが挙げられます。つまりマイナスの値をノイズとして除去することで、より特徴を掴みやすい効果が期待できる関数です。この関数は画像データと相性が良いようです。


関数の実装と、matplotlibを用いたグラフ表示は以下の通りになります。

   import numpy as np
    import matplotlib.pylab as plt
    def relu_func(x):
        return np.maximum(0,x) #入力値(x)と0を比較して大きい値の方を出力

    x = np.arange(-5.0, 5.0, 0.1)
    y = relu_func(x)
    plt.plot(x,y)
    plt.ylim(-1.1, 5.1)
    plt.show()


f:id:rossamu:20191023174540p:plain


念のためReLU関数を数式で表した場合を確認しますと、以下の通りになります。


h(x)=\left\{\begin{array}{ll}0 & (x \leqq 0) \\x & (x > 0)\end{array}\right\}



上記の通り、ReLU関数はシンプルなため実装も単純なものになります。

ReLUは派生系がいくつかあるようなので今後登場してくるかもしれません。

最後に

今回はReLUの概念についてあっさりとまとめたものになります。次回はNumpyを用いた少し複雑な計算に入っていきます。

参考

【読書メモ】Deep Learningを学ぶ〜ニューラルネットワーク(多層パーセプトロン)とシグモイド関数〜Part 8

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain


今回はニューラルネットワークの概念と、識別を行う際の処理を学んでいきます。

ニューラルネットワークとは


ニューラルネットワーク(多層パーセプトロンは単純パーセプトロンと似た部分が多いです。以下が図の例となります。今回この本では、重みを持つ層のみを数えて「2層ネットワーク」と呼ばれています。

f:id:rossamu:20191023164313p:plain

(書籍によっては、ネットワークを構成する層がn個→n層ネットワークと呼んでいることがあるようです)


ここで、場合分けの式をよりシンプルするために、今まで使用していた式を以下の式を経て、一つにまとめます。

1:

$$ a = b + W_1X_1 + W_2X_2 $$


2:

$$ y=h(a) $$


$$ y=h(b+W_1X_1+W_2X_2) $$


3:


h(x)=\left\{\begin{array}{ll}0 & (x \leqq 0) \\1 & (x > 0)\end{array}\right\}


入力信号の総和がh(x)という関数によって変換され、返還後の値が出力yとなります。このh(x)のような関数は「活性化関数」と呼ばれ、どのように活性化(発火)するかを決める役割があります。この式を明示的に図示するとしたら以下のようになります。尚、バイアス(b)の入力信号は常に1となるため、ほかのニューロンと差別化されます。

f:id:rossamu:20191023164346p:plain


図の中では入力信号を受け取ったニューロン内で、h()という活性化関数によって重み付き信号の総和である ay に変換されるプロセスが示されています。

h(x)のような活性化関数は、閾値を境にして出力が切り替わる関数で「ステップ関数(または階段関数)」と呼ばれています。つまり単純パーセプトロンでは活性化関数にステップ関数を利用している、といえます。このステップ関数を別の関数に変更することでニューラルネットワーク(多層パーセプトロン)を扱うことができるようになります。その一つがシグモイド関数です。シグモイド関数ニューラルネットワークの歴史の中でも古くから利用されてきた関数となります。
どちらの関数も出力信号の値は0〜1の間となります。

標準シグモイド関数


$$ h(x) = \frac{1}{1+e^{-x}} $$


eネイピア数(参考:https://www.nli-research.co.jp/report/detail/id=58572?site=nli )の 2.7182...の実数を表します。信号はシグモイド関数を用いて変換が行われた後、次のニューロンへ伝えられます。
シグモイド関数を用いることでステップ関数を滑らかな曲線にすることができます。単純パーセプトロンではニューロン間を0か1で信号を表していたのが、ニューラルネットワークでは連続的な実数値の信号(例:0.1, 0.2, 0.3....,0.8, 0.9)が流れます。

また、特徴としては以下の点が挙げられます。

  • 入力xの値が大きくなると値は1に近くなる(分母が1に近くなる)が1そのものにはならない
  • 入力xの値が小さくなると値は0に近くなる(分母が∞に近くなる)が0そのものにはならない
  • xが0の時に値は\frac{1}{2}になる。



活性化関数の実装

ステップ関数の実装

単純な実装


単純パーセプトロンで使用するステップ関数として、単純な実装を行う場合は以下のようなコードになります。

def step_func(x):
    if x>0:
        return 1
    else:
        return 0



NumPyの配列に対応した実装


def step_np_func(x):
    y = x > 0 #xの各要素に対するboolの配列が生成される
    return y.astype(np.int) #boolをint型に変換して値を返却


ステップ関数は0,1で階段状に値が切り替わるため、「階段関数」と呼ばれることがあります。



シグモイド関数の実装


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


Np.exp(-x)e^{-x}と等価です。関数に対してNumPy配列を渡しても問題なく計算が行われます。
この関数とmatplotlibというライブラリを使用してグラフ表示(入力は-5から5まで)すると以下のような滑らかな線の出力が得られます。

f:id:rossamu:20191023162054p:plain



最後に


今回は標準シグモイド関数という新たな関数について学ぶことができました。次は「ReLU関数」について学んでいきます。まだ序盤ではありますが、頑張って学習していきます。

参考


【読書メモ】Deep Learningを学ぶ〜多層パーセプトロンとXOR〜Part 7

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain



今回はパーセプトロンを用いたXORゲートについて考えていきます。

XORゲート


排他的論理和と呼ばれる論理回路です。

X_1 X_2 Y
0 0 0
1 0 1
0 1 1
1 1 0



これはパーセプトロンで実装することができません。

例えばANDやORを図として表してみます。

f:id:rossamu:20191023160046p:plain

f:id:rossamu:20191023160114p:plain



次にXORの図を作成してみます。

f:id:rossamu:20191023160143p:plain


今までのように直線で0と1を分けることができません。分けようと思った場合には、パーセプトロンでは表現ができない曲線(非線形)を描かなければなりません。

XORをパーセプトロンで表現するためには、パーセプトロンの「層を重ねる」必要があります。つまり、「AND, NAND, ORゲートを組み合わせる」ということになります。この辺は学校で「論理回路」や「デジタル回路」について学んだ時にやった覚えがあるかもしれません。

f:id:rossamu:20191023160143p:plain



X_1 X_2 NAND OR tex:Y
0 0 1 0 0
1 0 1 1 1
0 1 1 1 1
1 1 0 1 0


(実装例)

 def XOR(x1,x2):
     nand_y = NAND(x1,x2)
     or_y = OR(x1,x2)
     xor_y = AND(nand_y,or_y)
     return xor_y



このように層(x1,x2→nand_y,or_y→xor_y)を重ねたパーセプトロンのことを「多層パーセプトロンと言います。ニューロンによる表記を行うと以下のようになります。

f:id:rossamu:20191023160239p:plain


多層パーセプトロンにすることで、より柔軟な表現が可能になります。多層パーセプトロンを用いることで(理論上は)コンピュータを再現することも可能です(ただし骨が折れるレベルの調整が必要とのこと)。

しかし、ここまでの知識だけでは、重みづけを手作業で行う必要があります。この必要性をなくすために適切な重みパラメータを自動学習する性質をもつ「ニューラルネットワーク」について、今後学んでいきます。

最後に


これで二章が終わりました。本の1/7が終わったというところです。これからどんどん難しくなっていくと思いますが、できるだけスピーディーに読了したいと思います。

【読書メモ】Deep Learningを学ぶ〜単純パーセプトロンと論理回路〜Part 6

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねてまとめた記事となります。ただし本の内容をそのまま書き写ししているわけではなく、ある程度自身で調べたものや感想が混じっています。ご了承ください。

f:id:rossamu:20190103000547p:plain ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

また、本記事は株式会社よむネコのプロジェクトの業務内のお時間を頂いて蓄積した知見となります。
以下会社URLです。

http://www.yomune.co/ f:id:rossamu:20191023153505p:plain


今回は単純パーセプトロン(又は、人工ニューロン)と呼ばれるモデルについての紹介とアルゴリズムがテーマとなります。


単純パーセプトロンとは


ニューラルネットワークのモデルの中でも非常に単純で基本的なアルゴリズムです。
情報の伝達と処理を行う「ニューロン」という脳の神経細胞が、樹状突起という部位を用いて、ほかの細胞からの入力信号を受けます。ここでいう信号とは、電流のような「流れ」をもつものがイメージされます。つまり信号が流れを作り、情報を先へと伝達します。ニューロン同士はシナプスというつなぎ目を作り、樹状突起シナプスを通して信号を受け取っています。この、樹状突起はしばしば複数伸びて枝分かれをしており、ニューロンが入力信号を複数受け取る場合があります。


(参照:「京都大学 神経細胞の樹状突起が脳内の「道しるべ」を感知する仕組みを発見」の図1より

例えば入力信号がX_1X_2で、出力がYとします。ここで、シナプスの伝達効率というものはそれぞれ異なっており、入力信号がニューロンへ送られる際には「結合荷重」という重みが乗算されます。この重みは、各信号の重要性をコントロールする要素です。つまり、「重みが大きい=その信号の重要性が高い」ということになります。入力信号の入力X_1における重みをW_1、入力X_2における重みをW_2と表します。


y=\left\{\begin{array}{ll}0 & (W_1X_1+W_2X_2 \leqq θ) \\1 & (w_1X_1+W_2X_2 > θ)\end{array}\right\}




入力信号がある閾値を超えると"1"、越えなかった場合には"0"という信号が出力されます。この閾値を含めた実装式を今後考えていくにあたって、θ-bとします。


y=\left\{\begin{array}{ll}0 & (b+W_1X_1+W_2X_2 \leqq 0) \\1 & (b+w_1X_1+W_2X_2 > 0)\end{array}\right\}




b「バイアス」と呼ばれ、発火のしやすさを調整するパラメータとして機能します。

単純な論理回路の考え方と実装

パーセプトロンを使用することで、単純な論理回路を表現することもできます。それぞれの入力信号と出力信号の対応表である「真理値表」と、実装コードを確認しつつゲームAIで使用できそうな例を考えてみようと思います。作業としては、真理値表を満たすようなW_1W_2θの値を決めることとなります。



「ANDゲート」

X_1 X_2 Y
0 0 0
1 0 0
0 1 0
1 1 1


(これを満たす値の一例)


(W_1,W_2,b)=(0.5,0.5,-0.7)


(実装例)

def AND(x1,x2):
     x = np.array([x1, x2])
     w = np.array([0.5, 0.5])
     b = -0.7
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1


(想定される使用例) 敵が持つ要素の合計数値(W_1X_1+W_2X_2)が閾値(θ)を超える危険度や優先度になった場合にターゲティング(1:発火)する。



「NANDゲート」

X_1 X_2 Y
0 0 1
1 0 1
0 1 1
1 1 0


(これを満たす値の一例)


(W_1,W_2,θ)=(-0.5,-0.5,-0.7)


(実装例)

 def NAND(x1,x2):
     x = np.array([x1, x2])
     w = np.array([-0.5, -0.5])
     b = 0.7
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1


(想定される使用例) NAND=プレイヤーとの位置関係(例えば常に矢が当たる位置)にて「主人公と距離がある」「直線上に障害物がない」の両方を満たした位置の場合は移動をやめる(0)



「ORゲート」

X_1 X_2 Y
0 0 0
1 0 1
0 1 1
1 1 1


(これを満たす値の一例)


(W_1,W_2,θ)=(0.5,0.5,0.4)


(実装例)

 def OR(x1,x2):
     x = np.array([x1, x2])
     w = np.array([0.5, 0.5])
     b = -0.4
     tmp = b + np.sum(w*x)
     if tmp <= 0:
             return 0
     elif tmp > 0:
             return 1


(想定される使用例) HPが減っているかMPが減っている(または両方)の場合にHPとMPが回復するアイテムを使用する(1)。



最後に

単純パーセプトロンの仕組みについて深掘りするのが中々難しかったですが、理解してくると読み進めるのが楽しいなと感じます。引き続き、次はこれまでのパーセプトロンでは実現できないXORゲートを見ていこうと思います。

参考

【読書メモ】ゲームAIを学ぶ〜 1.3 Selling the Illusion 前編〜

 

最初に

本記事は以下の本から得た知見を自分用のメモも兼ねて要約したり、まとめた記事となります。ただし本の内容をそのまま書き写ししたり翻訳しているわけではなく、自身で調べたものや感想が大幅に混じっています。あと英語力が足りないため意味合いも違うかもしれません。参考程度に見てもらえればと思います。あと間違ってたら教えてもらえると嬉しいです。

f:id:rossamu:20190103020035p:plain

https://www.amazon.co.jp/Game-AI-Pro-Collected-Professionals/dp/1498742580

 

1.3 Selling the Illusion

1.2で錯覚がどのように働き、強められるのかを学習しました。次は錯覚をより促進させるために、「期待値」と「パフォーマンス」について解説されるようです。

 

1.3.1 Promoting the Quality of the AI

 

期待値を管理する方法の一つとして、プレイヤーにAIの強みを教える手法があります。何年間もいくつかのゲームがプレスリリースやインタビューなどで自分たちのゲームAIのクオリティをアピールしてきました。その中には成功例もありますが、もちろんうまくいかなかった例も存在します。ここでは一旦省略します(本自体には具体例が書いてあります)。

 

期待値をうまく管理するために、ロード画面にゲームヒントという形でAIの側面を強調するという方法があります。これはつまり、プレイヤーに対して、AIがどのような考えで特定の行動を行うのかを、ヒントとして教えるという事です。これによってAIとゲームの両方をより興味深いと感じてもらえるかもしれません。

 

もしクリエイターの方がゲーム内で注目してほしいポイントがあれば、それをプレイヤーに明示的に知らせることは有効かもしれません。ただし、その場合はそのポイントに対して自信を持つ必要があります。

 

 

1.3.2 Perform with Animation and Dialog

AIの印象付けを行うためには、短い間に何かしらのパフォーマンスを見せる必要があります。これは、精緻なアニメーションと、会話を行わせる事で達成可能です。ただし、AIプログラマーが直接これらを作成することはありません。AIプログラマーができる最善の手は、経営陣に対してそれらのアセット作成は必要であると、説得力のある主張を行うことです。これ自体はとても重要であるため、最優先事項となる必要があります。

この重要さを理解するために、ごく短い思考実験を行ってみましょう。プレイヤーがAIキャラクターのことを理解するまでの過程全てを想像してみましょう。

例えばキャラクターが笑ったり、倒れたり、攻撃しているといった動きを通じて、プレイヤーはキャラクターを理解しようとします。これをAIのボキャブラリーと呼びます。AIのボキャブラリーは、全ての会話クリップや、声、全アニメーション、全インタラクションで構成されています。

 

もし、あるAIキャラクターのサウンドクリップが「唸り声」と、「死亡時の叫び声」の2つと、アニメーションがIdle、Walk、Attack、Dieの4つだけだったとしたら、このAIのボキャブラリーは酷く矮小なものとなります。この場合は、皮肉にも、キャラクターが死ぬ瞬間が、最もプレイヤーの興味を引く時となります。

 

このレベルの限られたボキャブラリーだと、高い知性を持つAIであるとプレイヤーに伝えることは事実上不可能です。幸いにも、プログラム的な方法でAIボキャブラリーに、頭部の見かけ部分を追加することが可能です。AIキャラクターの頭と視線を直接コントロールできれば、AIキャラクターがステージ内のオブジェクトを認識したり、オブジェクト同士を比較したり、アクションを予測したりなど、本当に環境を認識しているかのように見せることができます。

 

 では簡単な例で確認してみましょう。AIキャラクターの左右に敵が二人いたとします。複雑な評価処理を実行した後に、AIは左の敵と戦うのがベストだと判断します。ここでの問題は、この精緻な判断が目に見えない形で即時に行われていることです。もちろんこのフローによってAIが瞬間的に賢い選択を行っていて、右の敵は今は考えなくていいとプレイヤーに伝えることができます。

しかし、もしAIが左の敵を攻撃する前に、敵それぞれを見て大きさを測ったように見えたり、左の敵と戦ってる最中も時折右の敵を振り返って監視していたらプレイヤーはどう感じるでしょう。意識があって親近感が持てるAIキャラクターだと感じさせることは、プレイヤーを楽しませる良い演出となります。

 

プログラマーが制御可能なもう1つのアニメーション要素は速度です。動きを速くすることで、動揺や興奮、錯乱、神経質な様子を伝えることが出来ます。一方、ゆっくりとした動きではリラックスしてたり落ち着いていたり、状況把握している様子を伝えられます。

 

ゲームAIに知性を感じさせるための手法として、適切な状況で曖昧なリアクションをさせるというものもあります。プレイヤーが自由入力でAIと対話を行った際に、プレイヤーの発言をAIが理解できなかったり、不適切な発言をしていた場合は曖昧なリアクションをさせるのです。このリアクションの解釈はプレイヤーに任されます。(シーマンとかで活用してそうな気もします)

 

他にも、AIキャラクター同士で対話させることで知性を強調させることもできます。AIモジュール(レベルAI、キャラクターAI等)は現在の状況をモニタし、適切なタイミングで対話イベントを呼びだします。

 

 

最後に

次回は後半でもう三つの部分を書いていこうと思います。

翻訳やっと再開し始めました…遅い…。

フルハウスで学ぶ日常会話レベルの英語表現~S01E01 Part1 ~3:50~

 

最初に

英語をがっつり学びたいという意欲が湧いたため、Netflixを契約してしまいました。合わせてLanguage Learning with NetflixというNetflixでの英語学習に適したchrome拡張機能も導入してみたため、ちまちま海外ドラマを見て勉強していこうという所存です。

 

このブログ記事では、あの有名な日常ホームドラマ(?)のフルハウスを見ていき、その中で自分が新しく学んだ英語表現や気になった単語を書いていく予定です(実はもうエピソード13まで見終わっていますが…復習がてら)。

 

ããã«ãã¦ã¹ãã®ç»åæ¤ç´¢çµæ

 

完走目指して頑張りたいと思います。

 

単語

cab

タクシー(taxi)。taxiはイギリス英語、cabはアメリカ英語。

例:Your bags are in the cab.

 

rehearsed

「rehearsal」(リハーサル)。大々的に感じるが、今回は「打ち合わせ」という意味で使われている。

 

balding

はげてきてる。髪が薄い。

 

sweetheart

家族や恋人、友人を含めた親しい人への呼び方。

https://tsukaueigo.com/21427138-2/

 

英語表現

gotta 動詞の原形

「get to 動詞の原形」と同じ。正式な英文法では「have to 動詞の原形」で「~する必要がある」という意味。ただしネイティブがよく使うのはgottaの方。

例:She's really gotta go.「彼女はもう行かなきゃ」

 

would have 過去分詞

過去を想像した「~しただろう」という意味。

 

don't ya?

「don't you?」と同じ意味。意味的には「~だよね?」みたいな。

例:You remember dad, don't ya?「あなたの夫だよ、覚えてる?」 

 

goint to 

すでに決まって予定している未来のことを話す時に使う。

「これから~する予定だ」

https://eikaiwa.dmm.com/blog/39416/#a

例:Are we going to have fun or what?「なにして遊ぼうか」

 

have fun

「楽しんで」的な。「Enjoy」は誰にでも使えるが、「have fun」は親しい間柄で使う。「いってらっしゃい」的なニュアンスもあるらしい。

 

or what

「~か何かなの?」「それとも?」という意味。

 

work out

「うまくいく」「良い結果になる」という意味。よく使われる。

例:Everything's going to work out super great.

 

gonna

「going to」の省略形。友人、恋人、家族間で会話に使える。

 

look alive!

「ぼんやりするな」「ぐずぐずするな」「さぁ早く!」みたいな意味。今回はジェシーが注意を引くために使ってる。

例:Hey,look alive!

 

one less

「一つ減った」という意味で、悩みや不安が一つ解決した時の決まり文句。

例:It's okay, one less to brush.「歯磨かなくて済む」

 

最後に

一旦眠くなってきたので今日はここまでにしておきます。一度確認したつもりでも調べてみると結構メモしておきたい事柄や「これどうだったかな」といった表現も多くて結構時間がかかってしまいました。ちなみにまだこれで4分弱です。

 

続きはまた明日。

Microsoft MVPを再受賞してMSMVP2年生になったご報告

Microsoft MVP 再受賞しました


部門は相変わらずDeveloper Technologies となります。初めて受賞したのが去年の3月のことですが、あっという間に二年目受賞の時期となりました。今年も無事に受賞することが出来て一安心です。

再受賞を頂くにあたって必要となったコミュニティ活動や技術ブログ執筆活動は、どれも応援やご支援して下さる方々あってこそのものです。本当に有難うございました。

TwitterFacebookでもたくさんのお祝いの言葉を頂きました(ちょっとイイネ数とRT数が思ったより多くて嬉し恥ずかしいくらいです)。

私の場合は体調のこともあり、生活でも少し困窮するくらい金銭的な余裕がなく、MVP Global Summitに参加することは叶いませんが、それ以外の特典を活かして、これからもゆるく、楽しみながらインプットとアウトプットを行っていこうと思っておりますので、生ぬるい目で見守っていただけると幸いです。どうぞよろしくお願い致します。