こんにちは!インストラクターのフクロウです!
ニューラルネットワークの過学習対策でもおなじみのL1ノルム、L2ノルムを計算するnp.linalg.norm関数を紹介します!
使い方はとっても簡単!この記事で
- ノルムって何?
- np.linalg.normってどう使うの?
- 機械学習ではどう使われるの?
の三点を押さえて、使いこなしちゃいましょう!
ノルムって何?
(簡単に言うと)原点などからある点までの距離(大きさ)をノルムといいます。
ノルムにはいくつか種類があって、代表的なものとしてはL0ノルム、L1ノルム、L2ノルムなどがあります。
L0ノルム
これは0以外の値を持つ次元の数のことです。
(ちゃんとした定義を知りたい方は以下の資料を見ましょう。)
L1ノルム
これは各次元の値の絶対値の和のことです。
「マンハッタン距離」という距離の考え方と同じ計算式です。
L2ノルム
各次元の値を2乗した和の平方根がL2ノルムです。
「ユークリッド距離(普通の距離のことです)」という距離の考え方と同じ計算式です。
L2ノルムは中学校でも習ったおなじみのものです。
下のグラフの矢印の長さを求めます。
import numpy as np import matplotlib.pyplot as plt plt.figure() # 矢印(ベクトル)の始点 O = np.array([0,0]) # 矢印(ベクトル)の成分 X = np.array([4,3]) # 矢印(ベクトル) plt.quiver(O[0],O[1], X[0],X[1], angles='xy',scale_units='xy',scale=1) # グラフ表示 plt.xlim([-5,5]) plt.ylim([-5,5]) plt.grid() plt.draw()
np.linalg.normの使い方
np.linalg.normはノルムを計算する関数です。
引数に配列を渡せば他のNumPy関数同様に計算してくれます。
大事な引数であるordを中心にコードを見てみましょう。
ordはL0, L1, L2などの指定に使うパラメータです。
L0ノルム
Xの中で0でない値は2つなので……
>>> np.linalg.norm(X, ord=0) 2.0
L1ノルム
要素の絶対値の和は7なので……
>>> np.linalg.norm(X,ord=1) 7.0 >>> np.sum(np.abs(X)) 7
L2ノルム
三平方の定理を思い出してください。
>>> np.linalg.norm(X, ord=2) 5.0 >>> np.sqrt(np.sum(np.abs(X**2))) 5.0
ノルムって何に使えるの?
ノルムの計算、特にL1ノルムやL2ノルムは、ニューラルネットワークの不要なパラメータを削ったり、過学習を防ぐために使われています。
L1正則化、L2正則化などと呼ばれるものです。
結合重みのノルムを計算して、この値を損失関数にペナルティ項として追加することで利用します。
詳しく知りたい方は以下の記事がおすすめです。
まとめ
この記事では、NumPyでノルムを計算する関数「np.linalg.norm」を紹介しました。
機械学習の実装ではL1ノルムやL2ノルムが大活躍しますよ。
使い方も簡単なので、是非使ってみてください!