{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 多次元配列の計算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "行列のおはなし。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ニューラルネットワークのための行列の積\n", "\n", "入力 $x_1, x_2$ を $X$、重み $w_1, w_2, w_3 ... w_6$ を $W$ とすると、その出力結果 $Y$ はどうなるのか…?というプログラムを書く。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "X.shape = (2,)\n", "W = [[1 3 5]\n", " [2 4 6]]\n", "W.shape = (2, 3)\n", "Y = [ 5 11 17]\n", "Y.shape = (3,)\n" ] } ], "source": [ "import numpy as np\n", "\n", "X = np.array([1, 2]) # 1 x 2の行列\n", "print( f'X.shape = {X.shape}')\n", "\n", "W = np.array([[1, 3, 5], [2, 4, 6]]) # 2 x 3の行列\n", "print( f'W = {W}')\n", "print( f'W.shape = {W.shape}')\n", "\n", "Y = np.dot(X, W) # 1 x 3 の行列\n", "print( f'Y = {Y}')\n", "print( f'Y.shape = {Y.shape}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 🤔コピペしたけどよくわからぬ\n", "\n", "一旦式にしてみよう。\n", "\n", "入力は2つ、数列は$x_1, x_2$\n", "\n", "出力結果$Y$は…今回は2つの入力から、3つの出力を得るので\n", "$$\n", " Y = y_1, y_2, y_3\n", "$$\n", "\n", "重み$W$は…2つの入力に対して出力を3つにしたいので…重みは $2 \\times 3 = 6$ 個必要だ。\n", "$$\n", " w_1, w_2, w_3, w_4, w_5, w_6\n", "$$\n", "\n", "出力結果$Y$を得るための計算は\n", "$$\n", " y_1 = x_1 w_1 + x_2 w_2\n", "$$\n", "$$\n", " y_2 = x_1 w_3 + x_2 w_4\n", "$$\n", "$$\n", " y_3 = x_1 w_5 + x_2 w_6\n", "$$\n", "\n", "つまり、\n", "$$\n", " Y = y_1, y_2, y_3 \\\\\n", " = (x_1 w_1 + x_2 w_2), (x_1 w_3 + x_2 w_4), (x_1 w_5 + x_2 w_6)\n", "$$\n", "\n", "\n", "うお、見難いな!…しかしなんとなく行列の積になりそうになってきた。\n", "\n", "仮に、$Y' = \\begin{bmatrix} y_1 & y_2 & y_3 \\end{bmatrix}$とすると\n", "\n", "$$\n", " Y' = \\begin{bmatrix}\n", " x_1 w_1 + x_2 w_2 & x_1 w_3 + x_2 w_4 & x_1 w_5 + x_2 w_6\n", " \\end{bmatrix}\\\\\n", " = \\begin{bmatrix}\n", " x_1 & x_2\n", " \\end{bmatrix}\n", " \\begin{bmatrix}\n", " w_1 & w_3 & w_4 \\\\\n", " w_2 & w_5 & w_6\n", " \\end{bmatrix}\n", "$$\n", "\n", "それっぽくなってきた。\n", "\n", "$\\begin{bmatrix}\n", " x_1 & x_2\n", " \\end{bmatrix}$を$X$、$\\begin{bmatrix}\n", " w_1 & w_3 & w_4 \\\\\n", " w_2 & w_5 & w_6\n", " \\end{bmatrix}$を$W$として、置き換えると\n", " \n", "$$\n", " Y' = X \\times W\n", "$$\n", "\n", "つまり、ニューラルネットワークの計算は、行列に置き換えると計算しやすい、ということ。おー、納得した!" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 }