可以简单地将神经网络理解为一个函数,即将输入的数据进行某种变化成新的输出,神经网络有三个层:输入层,隐藏层,输出层,隐藏层一般可以有很多个,每一层有若干个神经元,以下我们构建一个简单的神经网络(一个输入层,一个隐藏层,一个输出层):
这个神经网络将二维数据转化为三维数据输出(输入层两个神经元,输出层三个神经元)。
神经网络的每一层是由神经元构成的,每个神经元包含一个值x,每个神经元指向下一个神经元的箭头表示当前神经元的权重w,同时包含一个常数b,称为偏置常数,此时,下一个神经元的值为当前神经元乘以权重加上偏置(这是无激活函数时的情况,激活函数下文会说明)。
这个神经网络的python代码实现如下:
import numpy as np # 设置权重与偏置 w1 = np.random.randn(2, 4) b1 = np.random.randn(4) w2 = np.random.randn(4, 3) b2 = np.random.randn(3) # 神经网络推理 x = np.random.randn(5, 2) h = np.dot(x, w1) + b1 s = np.dot(h, w2) + b2 print(s)
w1, w2分别为第一层到第二层,第二层到第三层的各神经元的权重,b1, b2分别为他们的偏置常数,h即为隐藏层各神经元的值,s为输出层各神经元的值。
实际情况中,每个神经元的值不是简单的由上一层神经元的值与权重和偏置进行运算决定的,往往隐藏层的神经元有一个激活函数,一个简单的例子是sigmoid激活函数,sigmoid函数接收任意实数,返回0~1的实数,公式如下:
用python代码实现如下:
def sigmoid(x): return 1 / (1 + np.exp(-x))
我们将隐藏层加入一个sigmoid激活函数,变化后的代码如下:
import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) # 设置权重与偏置 w1 = np.random.randn(2, 4) b1 = np.random.randn(4) w2 = np.random.randn(4, 3) b2 = np.random.randn(3) # 神经网络推理 x = np.random.randn(10, 2) h = np.dot(x, w1) + b1 a = sigmoid(h) s = np.dot(a, w2) + b2 print(s)
此时上一层神经元值与权重,偏置常数计算后的值作为激活函数的自变量,这时隐藏层神经元的值为激活函数的值
以上就是简单的神经网络介绍与实现代码啦。参考书籍:《深度学习进阶:自然语言处理》——斋藤康毅