アフィン変換とは

Google先生に聞くと以下の引用き記載した記事が最初に出てきます。
数学は中学までは得意でしたが。。。ここまでくるとサッパリわかりませんw
どのあたりがアフィン変換なのかというと「ax+b」のあたりがアフィン変換らしいです。
アフィン変換には、画像を水平移動、垂直移動、拡大/縮小、せん断、反転、回転といったことを実現させるために利用する関数だそうです。
そのあたりの説明は他のサイトが解りやすかったので、Qiita(完全に理解するアフィン変換)をご紹介します。
このサイトにある情報で、アフィン変換を行うと画像に様々な効果を与えてくれることはよくわかります。
アフィン変換は、一次変換に平行移動を加えたものです。 中学数学で習う比例 y=ax を一般化したものが線形変換(一次変換)で、1次関数 y=ax+b を一般化したものがアフィン変換です
アフィン変換の意味と4つの基本要素 – 具体例で学ぶ数学


アフィン変換って何のために行ってるのか?

アフィン変換が画像に様々な効果を与えてくれることは他サイトのおかげでよくわかりました。そして、機械学習でアフィン変換が何故?必要なのか?残念ながら他のサイトの情報ではわかりませんでした。何故なら「0からDeepLearning」では、画像の回転については触れていないためです。
y=ax+b
この式をパーセプトロンに当てはめると、以下のイメージになります。
「(x1×重み1)+バイアス」の式と「(x2×重み2)+バイアス」の結果がyになるという図式です。
以下の図式でyを求める式は活性化関数で求めます。
ReLU関数やステップ関数がそれですね!
詰まるとことろ。「アフィン変換」という言葉を使っておりますが、
実際には『(入力値×重さ)+バイアス』という数式を行列計算で実現しているだけ。
「アフィン変換」なんて言葉を使っていますが、画像の傾き縮尺といったアフィン変換の本来の目的としては使っていないのです。

アフィン変換のプログラム

最後に「セロから作るDeep Learning」では、アフィン変換のプログラムをどのように書いているのか、ご紹介します。
例によって、プログラムの説明は書籍をご覧になってください。
y=ax+bと冒頭で紹介した数式を、こちらのプログラムに当てはめると
y=Wx+bとなりそうですね。
def __init__(self, W, b):
self.W =W
self.b = b
self.x = None
self.original_x_shape = None
# 重み・バイアスパラメータの微分
self.dW = None
self.db = None
def forward(self, x):
# テンソル対応
self.original_x_shape = x.shape
x = x.reshape(x.shape[0], -1)
self.x = x
out = np.dot(self.x, self.W) + self.b
return out
def backward(self, dout):
dx = np.dot(dout, self.W.T)
self.dW = np.dot(self.x.T, dout)
self.db = np.sum(dout, axis=0)
dx = dx.reshape(*self.original_x_shape) # 入力データの形状に戻す(テンソル対応)
return dxオライリーJapan 斎藤康毅 著 「セロから作るDeep Learning」