Skip to content

Instantly share code, notes, and snippets.

@cocoatomo
Last active October 13, 2017 23:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cocoatomo/f01e58347882342bf6c63fb2df197a68 to your computer and use it in GitHub Desktop.
Save cocoatomo/f01e58347882342bf6c63fb2df197a68 to your computer and use it in GitHub Desktop.
『夏休みの自由工作:TensorFlowでじゃんけんマシンを作る』の数学的な誤りについて
『夏休みの自由工作:TensorFlowでじゃんけんマシンを作る』[1]
(原文は "My summer project: a rock-paper-scissors machine built on TensorFlow" [2])
という記事を見付けた。
最近、ディープラーニングを少しずつ勉強しているので、興味を引かれ読んでみた。
[1] https://cloudplatform-jp.googleblog.com/2017/10/my-summer-project-a-rock-paper-scissors-machine-built-on-tensorflow.html
[2] https://cloud.google.com/blog/big-data/2017/10/my-summer-project-a-rock-paper-scissors-machine-built-on-tensorflow#step-5-create-a-linear-model
扱っている題材やそこで使われている各技術要素は面白く、読んでいて飽きなかった。
ディープラーニングの理論的内容も、パーセプトロンというちょうど先日勉強したばかりの内容で記憶に新しく、理解の確認になった。
さて標題の件だが、こんな面白い記事にも残念な誤りが含まれていた。
その箇所は「手順 5:線形モデルを作る」だ。そして、この部分にある線形代数が関係する記述ほぼ全てに問題がある。
一言で言えば、ここで「線形代数」という言葉で言及されているものは線形代数ではない。
ではまず線形代数とは何かをざっくり述べるところから始めよう。
(線形代数について専門的なことが知りたければ、専門書を読むか、たとえば「物理のかぎしっぽ」[3] などの Web ページを参考にしてくれ。
初学者の場合は誤りが少ないと期待できる専門書を読む方をオススメする。)
[3] http://hooktail.sub.jp/algebra/VectorSpace/
線形代数の主役は「線形空間」と「線形変換」だ。
線形空間はベクトルを集めたもので、線形変換とはベクトルを引数に取りベクトルを返す関数のことだ。
線形変換を数式の形で書くと、
y = wx
となる。そう、小学校で習った比例の式だ。
比例を習ったときには、x, y, w は単なる数だった。
それを一般化して、数 x, y をベクトルに、係数 w を行列にすることもでき、
y = wx
というさっきと全く同じ形の数式で書ける。
結局、x, y が数 (という1次元空間の値) であろうとベクトルであろうと、
線形変換を表現する数式に変わりは無いということだ。
最小限の線形代数の説明を終えたところで、誤りを個別に指摘していこう。
> 皆さんが高校や大学で習った魔法のツール、「線形代数」
できれば「魔法のツール」で片付けずに、1つ1つの概念の定義を丁寧に読み込んで欲しい。(願望)
> 線形代数は、ある「空間」から他の「空間」への変換を扱うための数学です。
単なる「変換」ではなく「線形性を持った変換」だ。
ただし、文脈から推測できるために省略されたものと受け取ることもできる。
> 例えば、ある 1 次元空間から他の 1 次元空間への変換は以下の式で表せます。
> y = wx + b
この式は「+ b」の部分が余計。これがあるために線形変換ではなくなっている。
あるいは、線形変換に限らない1次元空間から他の1次元空間への変換を対象としているなら、
y = wx^2
という変換もその対象に含まれなければいけないが、もちろんこれは "y = wx + b" という形にはならない。
> ここで、x と y はそれぞれの 1 次元空間の変数で、w は重み(weight)、そして b はバイアス(bias)と呼ばれます。
> この式を使えば、「ニューヨーク市のタクシーに乗った距離」の空間から「ニューヨーク市のタクシー料金」の空間への変換が可能です。
> 重み w には 2.5 ドル(マイル単位の料金)、そしてバイアス b には 3.3 ドル(初乗り料金)をそれぞれ設定します。
そもそもの式が線形変換ではない。
1次関数 (1次式で表される関数) の説明としては、分かりやすい。
> このグラフで分かるように、重みとバイアス(まとめてパラメータと呼ばれます)によって直線の傾きと位置が決まります。
この内容自体は間違っていないが、これは1次関数の話になっている。
> これらのパラメータを調整すれば、あらゆる 1 次元空間から他の 1 次元空間への変換を表現できます。
あらゆる変換が表現できないのは、上で述べた通り。
> この同じ式を使って、任意の m 次元空間から他の n 次元空間への変換を表せます。
上と同様、任意の m 次元空間から他の n 次元空間への変換が表せるわけではない。
> 例えば以下の式は、ある 3 次元(3D)空間上の一点から他の 3D 空間への一点への変換を行います。
この文自体は間違いではない。
> このひとつの式で、あらゆる空間から他の空間への線形変換を行えます。
> 1 : 厳密にはアフィン変換と呼ばれます
脚注が追加されているが、この変換は「線形変換」ではなく「アフィン変換」だ。
アフィン変換は
y = wx + b
という式で表現される変換で、線形変換は b = 0 という特殊な場合のアフィン変換なのだ。
よって、本文で「アフィン変換」と書かず「線形変換」としているのは (脚注を考慮しても) 誤り。
> こうした式のことを「線形モデル」と呼びます。
私はまだディープラーニングを学び始めたばかりの身であるが、
「線形モデル」を調べてみるとこれは統計学の用語で、
用いられる数式が1次式であることから「線形」という言葉が付いているようだ。
ここらへんから数学の話ではなく、ディープラーニングの話になるので指摘はここまでとする。
繰り返しになるが、ここでの指摘は数学的な内容のみを対象としたもので、
この記事はいくつかの技術を使って作ってみた話として見れば興味深いものだ。
これらの指摘によって、数学的な内容以外の部分の価値が損われることは無い。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment