⼤⽩话讲解神经⽹络算法,原理如此简单!
“我在⽹上看到过很多神经⽹络的实现⽅法,但这⼀篇是最简单、最清晰的。”
⼀位来⾃普林斯顿的华⼈⼩哥Victor Zhou,写了篇神经⽹络⼊门教程,在线代码⽹站Repl.it联合创始⼈Amjad Masad看完以后,给予如是评价。
这篇教程发布仅天时间,就在Hacker News论坛上收获了574赞。程序员们纷纷夸赞这篇⽂章的代码写得很好,变量名很规范,让⼈⼀⽬了然。
下⾯就让我们⼀起从零开始学习神经⽹络吧。
实现⽅法搭建基本模块——神经元
在说神经⽹络之前,我们讨论⼀下神经元(Neurons),它是神经⽹络的基本单元。神经元先获得输⼊,然后执⾏某些数学运算后,再产⽣⼀个输出。⽐如⼀个2输⼊神经元的例⼦:
在这个神经元中,输⼊总共经历了3步数学运算,
先将两个输⼊乘以权重(weight):
x1→x1 × w1
x2→x2 × w2
把两个结果想加,再加上⼀个偏置(bias):
(x1 × w1)+(x2 × w2)+ b
最后将它们经过激活函数(activation function)处理得到输出:
y = f(x1 × w1 + x2 × w2 + b)
激活函数的作⽤是将⽆限制的输⼊转换为可预测形式的输出。⼀种常⽤的激活函数是sigmoid函数:
激活函数的作⽤是将⽆限制的输⼊转换为可预测形式的输出。⼀种常⽤的激活函数是sigmoid函数:
sigmoid函数的输出介于0和1,我们可以理解为它把 (−∞,+∞) 范围内的数压缩到 (0, 1)以内。正值越⼤输出越接近1,负向数值越⼤输出越接近0。
举个例⼦,上⾯神经元⾥的权重和偏置取如下数值:
w=[0,1]
b = 4
w=[0,1]是w1=0、w2=1的向量形式写法。给神经元⼀个输⼊x=[2,3],可以⽤向量点积的形式把神经元的输出计算出来:w·x+b =(x1 × w1)+(x2 × w2)+ b = 0×2+1×3+4=7
y=f(w⋅X+b)=f(7)=0.999
以上步骤的Python代码是:
import numpy as np
def sigmoid(x):
# Our activation function: f(x) = 1 / (1 + e^(-x))
return 1 / (1 + np.exp(-x))
class Neuron:
def __init__(self, weights, bias):
self.weights = weights
self.weights = weights
self.bias = bias
def feedforward(self, inputs):
# Weight inputs, add bias, then use the activation function
total = np.dot(self.weights, inputs) + self.bias
return sigmoid(total)
weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4 # b = 4
n = Neuron(weights, bias)
x = np.array([2, 3]) # x1 = 2, x2 = 3
print(n.feedforward(x)) # 0.9990889488055994
我们在代码中调⽤了⼀个强⼤的Python数学函数库NumPy。
搭建神经⽹络
神经⽹络就是把⼀堆神经元连接在⼀起,下⾯是⼀个神经⽹络的简单举例:
这个⽹络有2个输⼊、⼀个包含2个神经元的隐藏层(h1和h2)、包含1个神经元的输出层o1。
隐藏层是夹在输⼊输⼊层和输出层之间的部分,⼀个神经⽹络可以有多个隐藏层。
把神经元的输⼊向前传递获得输出的过程称为前馈(feedforward)。
我们假设上⾯的⽹络⾥所有神经元都具有相同的权重w=[0,1]和偏置b=0,激活函数都是sigmoid,那么我们会得到什么输出呢?
h1=h2=f(w⋅x+b)=f((0×2)+(1×3)+0)
=f(3)
=0.9526
o1=f(w⋅[h1,h2]+b)=f((0∗h1)+(1∗h2)+0)
=f(0.9526)
=0.7216
以下是实现代码:
程序员接活的平台网站
import numpy as np
# ... code from previous section here
class OurNeuralNetwork:
'''
A neural network with:
- 2 inputs
- a hidden layer with 2 neurons (h1, h2)
- an output layer with 1 neuron (o1)
Each neuron has the same weights and bias:
- w = [0, 1]
- b = 0
'''
def __init__(self):
weights = np.array([0, 1])
bias = 0
# The Neuron class here is from the previous section self.h1 = Neuron(weights, bias)
self.h2 = Neuron(weights, bias)
self.o1 = Neuron(weights, bias)
def feedforward(self, x):
out_h1 = self.h1.feedforward(x)
out_h2 = self.h2.feedforward(x)
# The inputs for o1 are the outputs from h1 and h2
out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))
return out_o1
network = OurNeuralNetwork()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421训练神经⽹络
现在我们已经学会了如何搭建神经⽹络,现在我们来学习如何训练它,其实这就是⼀个优化的过程。
假设有⼀个数据集,包含4个⼈的⾝⾼、体重和性别:
现在我们的⽬标是训练⼀个⽹络,根据体重和⾝⾼来推测某⼈的性别。
为了简便起见,我们将每个⼈的⾝⾼、体重减去⼀个固定数值,把性别男定义为1、性别⼥定义为0。
在训练神经⽹络之前,我们需要有⼀个标准定义它到底好不好,以便我们进⾏改进,这就是损失(loss)。⽐如⽤均⽅误差(MSE)来定义损失:
n是样本的数量,在上⾯的数据集中是4;
y代表⼈的性别,男性是1,⼥性是0;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。