其他

入门级难度构建Pyhton神经网络,硅谷AI网红手把手带你入坑

2017-05-19 雷锋字幕组 AI研习社

Siraj Raval 作为深度学习领域的自媒体人在欧美可以说是无人不知、无人不晓。


凭借在 Youtube 上的指导视频,Siraj Raval  在全世界吸粉无数,堪称是机器学习界的网红。说他是全球范围内影响力最大的 ML 自媒体人,怕也无异议。


因此,雷锋网 AI 研习社联系到了 Siraj 本人,并获得授权将他最精华的 Youtube 视频进行字幕汉化,免费推送给大家。我们将不定期更新,敬请关注!

雷锋字幕组为大家最新译制了Siraj深度学习系列,从机器学习和神经网络架构类型到数据可视化、小样本学习等从基础到应用的技巧,争取带领希望掌握神经网络的神奇魔力和想成为深度学习工程师的大家伙早日入坑!哦不,走向巅峰!!


今天主要讲的内容是如何用 Python 构建简单神经网络(文末点击阅读原文可抵达 GitHub 获取代码)。

https://v.qq.com/txp/iframe/player.html?vid=p0504xctc4f&width=500&height=375&auto=0

(建议在 Wi-Fi 环境下观看视频,土豪随意~)


为了方便流量不足的小伙伴们在路上看,我们特意整理出了图文版:

  大脑神经网络机制


在走进机器学习之前,我们回头想想,作为人类的我们是如何学习的?我们的大脑可以接收五类感知信息(视觉、听觉、触觉、嗅觉、味觉)并由其创造出层层概念。但是什么给了大脑这种特殊的能力,使人脑不同于自然界中的其它生命?所有我们经历或感受到的想法和记忆、自我认知,都产生于大脑。

在分子层面,大脑由大约1000亿个神经细胞(也称神经元)组成。每个神经元负责三项工作:第一项工作是从树突上接受一组信号;第二项工作是把这些信号整合在一起以决定是否需要把信息传递到细胞体中;最后一项工作是如果信号总和超过了一定阈值就发送动作电位信号,并通过它们的轴突传给下一组神经元。


  神经网络模型发展


在1943年,两位早期的计算机科学家Warren McCulloch 和Walter Pitts 发明了第一个神经元计算模型。他们的模型演示了一个神经元,可以接收二进制,将它们求和并且如果求和超过了一定的阈值,就输出1,如果没有,就输出0。这是一个简单的模型,但是在AI 的早期,这可相当了不起。



几年之后,一个叫Frank Rosenblatt的心理学家对McCulloch-Pitts的模型仍然缺少学习机制而感到失望,所以他在前人的想法之上设想了一个神经模型,称之为感知器(Perceptron),也称作单层前馈神经网络。我们称它为前馈,是因为数据只沿一个方向前进。


感知器引入了输入的权值概念。给定一些输入输出的训练集,它应该可以通过增大或减少每个连续特征数据的权值,并依据每个训练集的输出值来学习一个函数。这些权重值以数学的形式应用于输入,这样在每次迭代之后,输出预测变得更准确。


 使用 Python 构建神经网络


使用Python建立一个单层前馈神经网络(感知器),并且只需用到Numpy!


1. 在主函数中,先初始神经网络,定义成一个类。接下来演示时,为了方便参考,先print初始权重。现在看下数据集:



这4个例子中每个例子都有3个输入值和1个输出值,都是1或0,我们将以这些值来训练神经网络。所以当给定一个新的1和0数列时,训练后的神经网络将能够预测输出是1还是0。因为我们要确定它属于哪一类,这就是机器学习中的分类任务。我们将利用这些数据作为函数参数来训练神经网络。主函数代码和详细注释如下:


if __name__ == "__main__":

#神经网络初始化

neural_network = NeuralNetwork()

print "Random starting synaptic weights: "

print neural_network.synaptic_weights

# 训练数据集. 4个二进制数字的例子

# 每个例子有3个输入值和一个输出值

training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])

training_set_outputs = array([[0, 1, 1, 0]]).T

# 用数据集训练神经网络

# 训练的迭代次数为10,000  

neural_network.train(training_set_inputs, training_set_outputs, 10000)

print "New synaptic weights after training: "

print neural_network.synaptic_weights

#用新的输入值预测输出值

print "Considering new situation [1, 0, 0] -> ?: "

print neural_network.think(array([1, 0, 0]))


2. 现在我们来定义神经网络的类。当初始化类时,首先要做的是选择seed值(seed是一个任意整数,目的是为了每次都生成一样的随机数),接下来随机初始化权重值,并设置seed值,确保每次程序运行时它会生成相同的数字,这对于以后的调试是很有用。


我们将把随机权重值分配给3*1的矩阵,权重值的范围是- 1至1,平均值为0。接下来将写激活函数,在这个例子中是sigmoid函数,它描述了s形曲线。我们将输入值乘以权值的总和传入到神经元,将把它们转换为在0到1之间的概率值,这一概率将有助于进行预测。


将直接在预测函数中使用sigmoid函数,它把输入作为参数。为了得到输入值乘以权值的总和,需要计算输入值和权重值的标量积(矩阵乘法)。这就是权重值如何控制数据在神经网络中的流动并且返回预测结果。


3. 现在可以编写训练函数,这是代码的核心。我们将编写一个循环去迭代10000次,然后通过网络使用预测函数来传递训练集获取输出值(预测值)。

接下来计算误差(期望输出和预期输出之间的差值)。我们希望随着不断训练来减少误差,将通过迭代更新权值来实现这一点。我们要通过输入值转置矩阵乘以误差,计算得出调整值,然后乘以sigmoid曲线的梯度值。因此对偏差越大的权重值调整越多。输入值为0不会导致权重的更改,这个过程称为梯度下降(gradient descent)。


我们还将编写计算sigmoid导数的函数,导数给出了梯度或坡度,衡量我们对现有权重值的确信度,并帮助我们在正确的方向上更新预测。最后,一旦进行了调整,我们将用那个值更新权重值,这种将错误值反向传播至网络并调整权重的过程,就叫做"反向传播"。代码和注释如下:


from numpy import exp, array, random, dot

class NeuralNetwork():

def __init__(self):

# seed生成的随机数

# 确保每次程序运行时它会生成相同的数字

random.seed(1)

# 把随机权重值分配给3*1的矩阵

# 权重值的范围是- 1至1,平均值为0

self.synaptic_weights = 2 * random.random((3, 1)) - 1

# Sigmoid函数

# 把输入权重值转化为0到1的概率

def __sigmoid(self, x):

return 1 / (1 + exp(-x))

#  Sigmoid function的导函数

def __sigmoid_derivative(self, x):

return x * (1 - x)

# 通过试错训练神经网络

# 每次调整权重值

def train(self, training_set_inputs, training_set_outputs, number_of_training_iterations):

for iteration in xrange(number_of_training_iterations):

# 通过神经网络传递训练值

output = self.think(training_set_inputs)

# 计算误差

error = training_set_outputs - output

# 输入值转置矩阵乘以误差得出调整值,然后乘以sigmoid的梯度值

# 偏差越大的权重值调整越多

# 输入值为0不会导致权重的更改

adjustment = dot(training_set_inputs.T, error * self.__sigmoid_derivative(output))

# 调整权重

self.synaptic_weights += adjustment

def think(self, inputs):

return self.__sigmoid(dot(inputs, self.synaptic_weights))


作为Rosenblatt的早期想法,以及在其随后几十年神经网络并没有掀起大风大浪,只能完成简单的事情。但随着万维网从CERN项目发展起来,到今天人类的大规模神经系统,我们看到了爆炸性的数据和计算能力。


我们的生物神经网络是基于碳的,而人工神经网络是一个抽象的概念,甚至不存在于物理空间,以编程的方式创建。然而,尽管是完全不同的载体,它们都具有非常相似的处理信息机制。也许有一个智能定律被编码到我们的宇宙中并且双方越来越接近。


神经网络是一个受生物学启发的算法,这个算法在数据中学会识别模式。反向传播是一门流行的技术,通过梯度下降不断更新权值训练神经网络。当我们在大量数据上训练多层深度神经网络,使用大量的计算能力时,我们称这个过程为深度学习。


完整代码和数据集请参考 Github 链接(点击文末阅读原文进入)。

--------------------------------------------

  Siraj Raval 何许人也?

Siraj Raval 是 YouTube 极客网红,曾任职于 Twilio 和 Meetup,客户包括 Elon Mask 和 Google,教大家如何使用机器学习开发聊天机器人、无人驾驶车、AI 艺术家等视频点击量累计数百万。


  Siraj Raval 为什么这么火?

首先,当然是这位哥伦比亚大学高材生活儿好技术好,用自己特有的方式三言两语就能抛出一个原本晦涩的 ML、DL 概念,让听众细细咀嚼。再者,这家伙幽默逗比、口才便给。兴之所至常手舞足蹈,瞳仁奇光掩映,口吐智慧莲华。深度学习讲师不少,但这么风趣可亲的却不多。

延伸阅读:解惑:Python是否值得学习?最强语言展露端倪

 研习社特供福利  ID:OKweiwu

关注 AI 研习社后,回复【1】获取

【千G神经网络/AI/大数据、教程、论文!】
百度云盘地址!



  雷锋字幕组志愿者

下列同学参与了本文 / 视频的译制工作!

如果您对我们的工作内容感兴趣,欢迎添加组长微信 “iIoveus2014” 加入字幕组~



  人工智能之神经网络特训班

20 年清华大学神经网络授课导师,带你系统学习人工智能之神经网络!

一站式深入了解深度学习的发展现状、基本原理和主要方法。

点击图片抵达课程详细介绍~

课程链接:mooc.ai

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存