Published Date : 2020年7月20日17:46

ぬる~く説明するPythonとNumpyを使ったニューラルネットワークの作り方
How to create a neural network using Python and Numpy, which are loosely described


This blog has an English translation


YouTubeにアップした動画、「ぬる~く説明するPythonとNumpyを使ったニューラルネットワークの作り方」の補足説明の記事です。

Here's a little more about the 「ぬる~く説明するPythonとNumpyを使ったニューラルネットワークの作り方」 video I uploaded to YouTube.


目次

Table of Contents




動画の説明
Video Description



PythonとNumpyを使ったニューラルネットワークの作り方をぬる~く説明していきます。

Here's how to build neural networks using Python and Numpy.

前回の復習から入ります。

I'll start with the last review.

まず、ニューラルネットワークとはなんなのか?

First, what is a neural network?

ニューラルネットワークの模式図を見てみましょう。

Let's take a look at a schematic diagram of a neural network.

この色のついた丸がニューロンと言われるもので、それぞれがネットワークによってつながっています。

These colored circles are called neurons, and they are connected by a network.

ネットワークは入力された値を次のニューロンへ伝えていきます。

The network transmits the input values to the next neuron.

そして最終的には入力された値が出力されます。

Finally, the input value is output.

入力された値はネットワークの結びつきの強度によって、変化します。

The value you enter depends on the strength of the network connection.

ニューラルネットワークは簡単にいうと関数です。

Neural networks are simply functions.

入力した値に対して、ある計算をして、出力の値を出します。

Performs a calculation on the input value to produce the output value.

出力の値に何が出るのかは、関数がどんな計算式なのかで決まります。

The value of the output depends on what formula the function is using.

数学っぽく表現するとXを入力したらYが出てくるような計算をするものが関数です。

In mathematical terms, a function performs a calculation that results in Y when X is entered.

なぜニューラルネットワークはこのような形になっているのか?

Why are neural networks like this?

それは、ニューラルネットワークが人の脳の神経細胞のネットワークを簡略化して真似たものだからです。

Neural networks mimic the networks of neurons in the human brain.

神経細胞のネットワークは、このびよーんと伸びた触手のような物の先端にシナプスと呼ばれるものがあり、それが次の神経細胞に情報を伝えています。

A network of nerve cells, called a synapse, is located at the tip of this elongated tentacle and carries information to the next nerve cell.

神経細胞は学習によってシナプスの結合強度を変化させて、問題解決能力を持つようなネットワークの形を作ります。

Through learning, neurons change the strength of synaptic connections, forming networks that can solve problems.

同じようにディープラーニング等に使われる、ニューラルネットワークも学習をして問題解決をするようなモデルを作ることを目標としています。

Similarly, neural networks, which are used for deep learning, aim to create models that learn and solve problems.

神経細胞が伝えた情報はシナプス(赤丸で囲んだ部分)によって情報の強度が伝えられます。

The intensity of information transmitted by nerve cells is transmitted through synapses (area circled in red).

情報の強度がある一定の値を超えたら、情報が伝えられた神経細胞は発火と言われる現象が起きて、次の神経細胞に情報を伝えます。

When the intensity of the information exceeds a certain value, the nerve cell that receives the information will have a phenomenon called firing and transmit the information to the next nerve cell.

この値をしきい値といい、丁度機械のオンとオフのスイッチみたいなものだとイメージしてもらうと分かりやすいです。

This value is called a threshold value, and it is easy to imagine that it is just like a switch to turn the machine on and off.

より簡単にイメージしてもらうために、三つのニューロンが、しきい値が三のニューロンにネットワークを介して情報を伝えたとします。

To make it easier to imagine, three neurons might transmit information over a network to neurons with thresholds of three.

入力された値の総数がしきい値未満の場合、ニューロンは発火せず、何も反応しない状態になります。

If the total number of values entered is less than the threshold, the neuron will not fire and will not respond.

逆に今度はしきい値が3以上になるように入力した値を調整したら、出力側のニューロンは発火して、次のニューロンへ情報を出力します。

On the other hand, if you adjust the input value so that the threshold is greater than or equal to 3, the output neuron will fire and output information to the next neuron.

このようなニューロンが集まった層を作って、重ねてネットワークとして繋げるとニューラルネットワークができあがります。

If you build a layer of these neurons, stack them up and connect them together as a network, you get a neural network.

そしてこの何層にも重なったニューラルネットワークに問題を与え、正解と同じ回答を出すような学習モデルを組み立てるのが深層学習の目的です。

The goal of deep learning is to build a learning model that gives problems to these layers of neural networks and gives the same answer as the correct answer.

例えば、学習データに1から6までの数字があるとします。

For example, assume that the learning data has a number from 1 to 6.

ここで学習モデルに訓練データとして3を与えるとします。

Now, let's give the learning model 3 as training data.

まず最初に順伝播と呼ばれる出力側への流れに沿って、計算をして、出力値を出します。

First, we calculate the output value along the flow to the output side called forward propagation.

この例ではクラス分けと言われる学習モデルになっています。

In this example, it is a learning model called classification.

出力されたスコアは1から6までの数字である確率を表しています。

The printed score represents the probability of a number between 1 and 6.

スコアでは6である確率が49%となって最高確率になっています。

In the score, the probability of 6 is 49%, which is the highest probability.

しかし正解データは3なので、この正解データと間違った値の誤差を求めます。

However, since the correct data is 3, the error between this correct data and the wrong value is calculated.

その誤差を元に、逆伝播と呼ばれる入力側へ流れる計算を行い、学習モデルに設定されていたパラメーターと呼ばれる値を調整していって学習を進めるというのが、大体の流れです。

In most cases, the error is used to perform a calculation that flows to the input side, called backpropagation, and adjust the value called a parameter set in the learning model to advance learning.

ではどのようなパラメータでどのような式になっているかを見ていきましょう。

Let's take a look at what the parameters are and what the expression looks like.

Xを入力として、関数を通してYを出力するとします。

Suppose you want to output Y through a function with X as input.

この関数の式は入力Xに重みWをかけて、バイアスBを足したものです。

The expression for this function is input X, weighted W, plus bias B.

具体的にみると、Xが3、Wが4、Bが5ならYは17です。

Specifically, if X is 3, W is 4, and B is 5, Y is 17.

この式は丁度、一次方程式のような形になっています。

This equation is just like a linear equation.

重みが小さければ、傾きは右下方向に傾き、バイアスが大きければデフォルトの値が大きくなります。

The lower the weight, the lower the slope, the higher the bias, the higher the default value.

入力するXがたくさんある場合、Xをベクトルとして表現します。

If you have a lot of X to enter, represent X as a vector.

ベクトルとは大きさと向きを持つ量のことをいいます。

A vector is a quantity with a magnitude and orientation.

一つのニューロンに入力値を集約させる場合は重みも同じ数をもつベクトルになります。

If you aggregate the input values into a single neuron, the weights are also vectors with the same number.

バイアスはスカラと呼ばれる、一つの数ですが、結局同じ数のベクトルに変化します。

Bias is a single number called a scalar, but it eventually changes to the same number of vectors.

この場合一つのニューロンは一つの値を出力しますので、全ての式の結果を足し合わせたものになります。

In this case, one neuron outputs one value, so the result of all the expressions is added together.

では、今度は6つのXと同じ数の分だけ出力させるように、同じ数のニューロンに先ほどと同じような計算を行うとします。

Now suppose you want to perform the same calculation on the same number of neurons, so that you get the same number of outputs as the six Xs.

今度は重みがただの行ベクトルから6×6の行列に変わりました。

Now the weight has changed from just a row vector to a 6 × 6 matrix.

今回は行列の積と言われる計算式を行い、出力であるYは6つの数を持つベクトルとなりました。

This time, we performed a calculation called the matrix product, and the output Y became a vector with six numbers.

これは6つの入力にそれぞれ6つの重みをかけて、6つのバイアスを足して、6つの出力をだしたことになります。

This adds six biases to six inputs, each with six weights, and produces six outputs.

ではこの計算をPythonとNumpyを使って計算します。

Next, you perform this calculation using Python and Numpy.

適当なNumpyアレイを作成して、Numpy.dotを使って計算すると、一瞬で終わります。

If you create a suitable Numpy array and compute it using NumpyDOT, it will be done in a flash.

先ほどと同じ図で表現するとこのような感じになります。

It looks like this in the same diagram as before.

ではここで先ほどのしきい値を取り入れてみましょう。

Now let's take that threshold.

このしきい値を決める関数を活性化関数といいます。

The function that determines this threshold is called the activation function.

ある一定の数、この場合分かりやすく、50をしきい値として、50未満なら0、50以上なら1を返すといった関数を作り、これをステップ関数といいます。

A certain number, in this case it's easy to see, we create a function with a threshold of 50 that returns 0 if it's less than 50, 1 if it's greater than equal 50, and so on, and we call it a step function.

このStep関数をPythonで作ってみましょう。

Let's create this Step function in Python.

もう答えはでていますが、NumpyのWhereメソッドを使うと、条件式の次にTrueなら1を返す、Falseなら0を返すといったことを一つのベクトルや行列に対して一気に行えるので便利です。

The answer was already illustrated in the diagram, but Numpy's Where method is useful because it allows you to return 1 if True, 0 if False, and so on, all at once for a vector or matrix.


[ ]: Y
[ ]: array([26, 47, 68, 89, 110, 131])
[ ]: def ステップ関数(x):
...:     return np.where(x >= 50, 1.0, 0.0)
[ ]: A = ステップ関数(Y)
[ ]: A
[ ]: array([0., 0., 1., 1., 1., 1.])

ご覧の通り結果は図の通りになります。

As you can see, the result is as shown in the figure.

このステップ関数だと0か1しか出力しません。

This step function only prints 0 or 1.

学習をするためには結果を非線形、まあ曲線ようなグラフにする必要があります。

In order to learn, you need to make the result a nonlinear, rather curvilinear graph.

そのような出力をするためにシグモイド関数と言われるものを使用します。

We use what we call sigmoid functions for such output.



以上です。お疲れ様です。

動画が途中で途切れてしまったので、続きはニコニコ動画にアップしておきました。

That's all. Thank you for your hard work.

The video stopped in the middle, so I uploaded the rest on Niconico Video.






See You Next Page!