buto > /dev/null

だいたい急に挑戦してゴールにたどり着かずに飽きる日々です

ニューラルネットワーク 分かりやすくしてみた2

前回の記事では重回帰分析を例にしてニューラルネットワークを表現したが、そもそも重回帰分析ってscikit-learnなどで分析できるからわざわざニューラルネットワークで分析するの?ってなったので分類問題に当てはめる

ニューラルネットワークで分類

商品のデザインと品質から「商品を買う・買わない」を判定する

f:id:butorisa:20201020163920p:plain

前提

ニューロンからニューロンに渡る値には重みがかけられる 重みがかけられた入力値にはバイアスが付加される ニューロンから出力する値は活性化関数を通す

活性化関数はReLU(ランプ関数)を使う 活性化関数「Tanh」「Sigmoid」「ReLu」の仕組みと使い分けを数式なしで整理する/ディープラーニング

買う・買わないの判定方法

  • 入力値は(デザイン、品質が)良いなら「1」、良くないなら「0」
  • デザインまたは品質いずれかが「1」だったら買う
  • デザイン、品質どちらも「0」だったら買わない
  • デザイン、品質どちらも「1」だったら買わない(価格が高くて買えない)
  • 出力層の計算結果は買うなら「1」、買わないなら「0」
デザイン 品質 判定
1 1 買わない
0 1 買う
1 0 買う
0 0 買わない

入力層→中間層の計算

計算1

重み:入力層のデザイン、品質から「計算1」に向かう矢印    → 「入力値×重み」が計算1に入力される バイアス:「計算1」に付加される

重みは「5」、バイアスは「-5」にする

デザイン 品質 (デザイン×重み)+(品質×重み)+バイアス ReLU
1 1 5 5
0 1 0 0
1 0 0 0
0 0 -5 0

活性化関数はReLUなので、マイナスの値は0になる デザイン、品質が両方とも良いケースのみプラスの値になる

計算2

重み:入力層のデザイン、品質から「計算2」に向かう矢印    → 「入力値×重み」が計算1に入力される バイアス:「計算2」に付加される

重みは「-5」、バイアスは「5」にする

デザイン 品質 (デザイン×重み)+(品質×重み)+バイアス ReLU
1 1 -5 0
0 1 0 0
1 0 0 0
0 0 5 5

デザイン、品質が両方とも良くないケースのみプラスの値になる

中間層→出力層の計算

計算1の重み:中間層の「計算1」から出力層の「判定」に向かう矢印 計算2の重み:中間層の「計算2」から出力層の「判定」に向かう矢印        → 「入力値×重み」が判定に入力される バイアス:「判定」に付加される

計算1、計算2の重はを両方とも「-10」、バイアスは「10」にする

計算1 計算2 (計算1×計算1の重み)+(計算2×計算2の重み)+バイアス ReLU
5 0 -40 0
0 0 10 1
0 0 10 1
0 5 -40 0

計算1、計算2の結果が両方とも「0」のケースのみ出力が「1」になる → デザイン、品質のいずれかが良いケースだったら買うと判定される

まとめ

重みとバイアスを調整してReLUの計算を複数組み合わせると 「デザイン、品質のいずれか1だったら1を出力する」というように柔軟な判定ができる

ReLUの計算1つだけだと「デザイン、品質どちらも1」 「デザイン、品質どちらも0」の両方のケースに対して0を出力することはできない (プラスの値、マイナスの値にする境界を1本の線で引く感じ)