神经网络简介(一)

神经网络的重要性不必多说,直接进入主题。

本文主要讲解神经网络的一些基本算法及编程(如感知器、交叉熵、梯度下降等),逐步深入,最后教你搭建一个简单的神经网络(准备分4-5次讲完,请大家持续关注)。如果读者是小白,不了解神经网络,请自行百度。

简单来说,神经网络其实就是分类问题。比如寻找一条最佳的直线区分下图中的红色数据和蓝色数据。当然这只是简单地线性分类问题。随着网络层数的增加,神经网络可以处理许多复杂的非线性问题。

本篇主要介绍神经网络的基础--感知器及python代码实现

首先我们来看一个简单的分类问题。假设我们是一所高校的招生人员,主要工作是接受或拒绝申请的学生,而评估信息有两个:考试成绩test和在校期间的平时成绩grades(又是成绩!分分学生的命根啊!)。下图为学校历年录取的学生的两个成绩。蓝色的点表示被录取的学生,红色的点表示未被录取的学生。那么请问test分数为7,grades分数为6的学生会不会被录取呢?


历年学生的录取数据其实可以用如下的一条直线简单区分开。位于直线下方的大多数学生被拒绝,位于直线上方的多数学生被录取。把这条直线称作我们的模型,该模型的误差暂不考虑。回到上述问题,可以看出点(7,6)位于直线上方,可以比较确定该学生会被录取。

下面将上述问题转变为数学问题。

将横坐标变量记为x_{1},纵坐标变量记为x_{2}。假设我们已经知道这条直线的方程为2x_{1}+x_{2}-18=0。即学生得分为score=2*test+grades-18,然后输入学生的两个分数,如果得分为正(大于等于0),则接受,反之拒绝(此步骤叫做预测)。

那么扩展到一般问题上,直线方程可表示为:w_{1}x_{1}+w_{2}x_{2}+b=0。用向量法简记为WX+b=0。其中W称为权重,b称为偏差。用标签y标记我们要预测的内容,y取0(红点)或1(蓝点)。用标签\hat{y}表示预测结果,\hat{y}取0(拒绝)或1(接受)。我们的目的是让\hat{y}尽量逼近y。越逼近说明我们的直线方程越好,即分类效果越好。

那么如果再加入一个评估依据:x_{3}班级排名,该怎么做呢?bingo!我们需要在三维空间进行,即寻找一个平面w_{1}x_{1}+w_{2}x_{2}+w_{3}x_{3}+b=0划分数据。如果有n维,那么就是寻找n-1维的超平面划分数据。y\hat{y}仍与上述相同。

下面构建神经网络的基础--感知器。感知器是指将上述直线方程进行编码,形成小图形。如下图所示,此处偏差b看作b * 1,所以将b考虑为输入的一部分。

那么n维数据组成的感知器如下图所示。x_{1}x_{n}为输入节点,w_{1}w_{n}为边缘权重,b为偏置单元。最后输出结果为0或者1。此处使用了一个阶跃函数。

所以一个感知器可以完整的用下图表示。即将其看作节点的组合,第一个节点计算方程的输入,并把计算结果传给阶跃函数。第二个节点则根据计算结果输出预测结果。

上图用符号表示为:

由于感知器的结构与人类的神经元比较像,所以感知器构成的网络被称为神经网络。

讲完感知器,接着就来一个练习热热身:使用感知器实现“与”运算。

大家可以先自行尝试编写。

其代码如下(python),需安装pandas库:

import pandas as pd

# TODO: Set weight1, weight2, and bias
weight1 = 1.0
weight2 = 1.0
bias = -1.5


# DON'T CHANGE ANYTHING BELOW
# Inputs and outputs
test_inputs = [(0, 0), (0, 1), (1, 0), (1, 1)]
correct_outputs = [False, False, False, True]
outputs = []

# Generate and check output
for test_input, correct_output in zip(test_inputs, correct_outputs):
    linear_combination = weight1 * test_input[0] + weight2 * test_input[1] + bias
    output = linear_combination > 0
    is_correct_string = 'Yes' if output == correct_output else 'No'
    outputs.append([test_input[0], test_input[1], linear_combination, output, is_correct_string])

# Print output
num_wrong = len([output[4] for output in outputs if output[4] == 'No'])
output_frame = pd.DataFrame(outputs, columns=['Input 1', '  Input 2', '  Linear Combination', '  Activation Output', '  Is Correct'])
if not num_wrong:
    print('Nice!  You got it all correct.\n')
else:
    print('You got {} wrong.  Keep trying!\n'.format(num_wrong))
print(output_frame.to_string(index=False))

当然,感知器还可以实现“或”运算、“非”运算等,大家可以自行尝试。

介绍了这么多,大家可能会有疑问:计算机如何找到合适的线性方程啊?我们下节将解答这个问题。

如有问题,欢迎提问!!!

猜你喜欢

转载自blog.csdn.net/ting_qifengl/article/details/100555844