AI・機械学習用語についての勉強(1)

#今回は何するの？
###足りない知識を補填する勉強
>今回は足りない知識の補填を行うのに、前回の「損失関数」をもう少し勉強しつつ、「誤差関数」「コスト関数」「目的関数」との違いについて勉強しようと思います。

>今回勉強に使用させていただいたサイト様はこちらになります。

https://www.atmarkit.co.jp/ait/articles/2104/15/news030.html

では、勉強開始して行きましょう。

###用語用語
>機械学習における**損失関数(Loss function)**とは、「正解値」と、モデルによる出力された「予測値」とのズレの大きさ(これを**「Loss:損失」**と呼ぶ)を計算するための関数である。この損失の値を最小化/最大化することで、機械学習モデルを最適化する。

>例えば機械学習の一手法である**ニューラルネットワーク**では、損失関数は**誤差逆伝播法(バックプロパゲーション:Back-propagation)**と呼ばれる最適化の処理で用いられる。ちなみに誤差逆伝播法では、損失関数は**誤差関数(Error function)**とも呼ばれる。

>損失関数には、様々なものがあるが、特に**平均二乗誤差(MSE:Mean Squaread Error)**が有名である。他には、**平均絶対誤差(MAE)**や**平均二乗誤差の平方根(RMSE)**、**平均二乗対数誤差(MSLE)**、**Huber損失**、**ポアソン損失**、**ヒンジ損失**、**カルバック-ライブラー情報量(KLD)**などがある。これらは、モデルの性能を評価するための**評価関数**として使われることもある。

こんな感じのようですね。
つまりは、使用する時にその名前が変わってくるようなので混乱しそうになりますね。
まぁ、その時に「あ〜、確かこんな感じで呼ばれるんだなぁ」と記憶にあるだけでも良さそうですね。

前回でも損失関数はやりましたが、確か「平均二乗誤差」と「平均対数誤差」「平均絶対誤差」「交差エントロピー誤差」については勉強しましたが「Huber損失」「ポアソン損失」「ヒンジ損失」「カルバック-ライブラー情報量(KLD)」について補足して行きましょうか。

補足に当たっての参考記事は下記になります。

https://qiita.com/Hatomugi/items/d00c1a7df07e0e3925a8

######補足:Huber損失
>Huber Loosとは**損失が大きい平均絶対誤差(MAE)に似た機能をし、損失が小さいと平均二乗誤差(MSE)の機能になる。**
>MAEとMSEのいいとこ取りである。
>その機能通り*Smooth Absolute Loss*とも言われている。このMSEとMAEの切り替わりは$\delta$で設定する。これにより外れ値に寛容でありながらMAEの欠点を克服できる。

>```math
L_\delta(y,f(x))=\left\{
\begin{array}{}
\frac{1}{2}{(y-f(x))^2}\hspace{14mm}for\,|y-f(x)|\leq\delta\\
\delta|y-f(x)|-\frac{1}{2}\delta^2\hspace{3mm}otherwise.
\end{array}
\right.
>```

一応再度、平均絶対誤差と平均二乗誤差の特徴を記載しておきましょうか
>**MAEの一つの特徴として外れ値に寛容なことが言える。損失を二乗しないのでMSEのように外れ値の時の損失がそこまで大きくならない。**

>**MSEには損失関数の微分が常に一定になるという問題がある。**これは損失がどのような値であっても同じスピードで損失を埋めることを意味する。損失が小さい時に損失が大きい時と同じスピードで学習されては最適化できないだろう。損失が小さいとき、つまりモデルが細かい調整をするときはゆっくりと学習させるべきである。これは*leraning_rate*を予め小さく設定することを実現できるがベストとは言えない。

>**MAEは外れ値に寛容であったのに対し、MSEは寛容ではない。これは予測値と実測値の差を二乗しているからである。**

>例えば、MAEの損失が3だとするとMSEは9になる。ここでもしMAEの損失が大きくして(外れ値は損失が大きい)30とするとMSEは900になる。このことからMSEは外れ値に寛容でなく外れ値から大きく学習しようとする性質があることがわかる。
>このことは**MAEがデータの中央値寄りなのに対し、MSEは平均値に近いと考えるとわかりやすいだろう**
>ビジネス的な立ち位置で重要な場合はMSEを選ぶべきだろう。理由として、ちゃんと外れ値からの損失をモデルに組み込もうとしてくれるからである。
>ただしこの場合、他のデータの予測能力が劣ることも視野に入れなければならない。逆に外れ値がそこまで重要でない(ノイズに近い)データの場合はMAEを使うべきである。また、外れ値が完全なノイズの場合は外れ値をデータから除去してMSEを使うべきである。

######補足:ポアソン損失
>主にカウントデータで使われる。ポアソン分布が元である。**ポアソン分布とはX軸をとある事象が起こる数、Y軸をそのそれぞれの回数が起こる確率を表す分布である。**

>```math
L=\frac{1}{n} \sum_{i=1}^{n} (\hat{y}^{(i)}-y^{(i)}・log(\hat{y}^{(i)}))
>```

>**予測値の分布とポアソン分布の損失がポアソン損失である。**

######補足:ヒンジ損失(Hinge Loss)
>```math
f_1(x)=\left\{
\begin{array}{}
0&(x\leq0)\\
x-a&(x>a)
\end{array}
\right.
>```

>上の式は下の式と同等

>```math
f_1(x)=max(0,x-a)
>```

>この式も

>```math
f_2(x)=\left\{
\begin{array}{}
b-x&(x\leq b)\\
0&(x>0)
\end{array}
\right.
>```

>以下と同じである。

>```math
f_2(x)=max(0,b-x)
>```

>よってこれらを合わせると以下の等式になる。

>```math
t=\pm 1\\
L(y)=max(0,1-t*y)
>```

>**ヒンジ損失はSVM等で使われる。**

カルバック-ライブラー情報量については、ちょっと拘って書きたいのでまた今度補足します。
では本題に戻りましょうか。
###コスト関数との違い
>損失関数は**コスト関数(Cost function)**と呼ばれることもある。
>用語の使い分けるための厳密な定義はあるわけではないが、より基礎的な分野、具体的には統計学の回帰分析などにおいては、損失関数ではなくコスト関数という用語が使われる。
>また、コスト関数と呼ぶ場合、損失関数に**正則化(=過学習を避けるためのモデルの複雑さにペナルティーを与えるテクニック)**を加味したものを意味するとして、損失関数と区別されることがある。
>なお、そもそも誤差/損失/コストは、いずれも何かよくないものであり減らすべき対象という点で同じような意味である。

ふむふむ、用語の使い分け流ための厳密な定義は内容ですが、そもそも**誤差/損失/コストは、いずれも何かよくないものであり減らすべき対象という点で同じような意味である**という部分が重要ですね。

###目的関数との違い
>「損失関数」は機械学習でよく使われる用語であるが、より広範な分野、具体的には数学の最適化問題や統計学などにおいては、最適化の目的/対象(Object)であるため**目的関数(Objective function)**と呼ぶのが一般的である。つまり、目的関数は、誤差関数/損失関数/コスト関数などを含むより一般的な概念/用語であるとみなせる。

ふむふむ、結局のところ呼び方の明確な概念はないですが、**目的関数は、誤差関数/損失関数/コント関数などを含むより一般的な概念/用語であるとみなせる**この部分は覚えておいた方がいいですね。

さて、用語の勉強1回目はこのへんで良いでしょう。
では、いつもの挨拶を掲載して終わりましょう。
ここまで読んでいただきありがとうございました。

#挨拶
どうも、組込みエンジニアとして、とある企業におります粉です。

・では、組込みエンジニアですがAIエンジニア、機械学習エンジニアとして転職したいので、自身でいろいろと勉強を行っております。

・さて、なんでAIエンジニアや機械学習エンジニアになりたいの？と疑問をもたれる方も多いと思いますので、簡単に説明させていただきます。
１、元はAIを作ってみたい、社会問題、労働に関してもっと働きやすい環境が必要なのではないか？と考えたため様々な課題をAIなどの先端技術でアプローチをかけてみたいと思い、AIエンジニアを目指しました。
２、ですが、今やっているのは組込みエンジニアのため、使用する技術、言語が違うといったことから、独学でやってみようと思いまして、最近勉強をはじめました。
３、転職を目指す、自身の夢を叶えたいという願いもありますので、こうやって学んだことを記事しています。

・いろいろとお話ししましたが、まずは、私よりも知識、技術が豊富な先輩方から多くのことを意見、修正点、アドバイスをいただけることを楽しみにしています。

・まだまだ新参者、理解が足りていない部分もあるので記事を書きながら、修正を繰り返して理解を深めれればと思っております。(AIを研究している企業や研究機関に転職したいです。

・こんな手法もあるぞ、やり方はこうだ！！などの意見も募集しております。