人工神经网络算法实战教程

神经网络(Artificial Neural Network,也称为人工神经网络,简称ANN)具有通过示例学习能力。ANN是受生物神经元系统启发的的信息处理模型,它由大量高度互联的处理元素组成,这些处理元素被称神经元,整体协作用于解决实际问题。
它遵循非线性路径,并在整个节点中并行处理信息。神经网络是一个复杂的自适应系统,意味着它有能力通过调整输入的权重来改变其内部结构。

ANN主要用于解决对人很容易但对机器很难的问题,如:识别猫狗图片、数字图片。这些问题通常也称为模式识别,广泛应用于光学字符识别(OCR, optical character recognition)、物体检测等。本文主要介绍ANN并通过R示例介绍其实现过程。

介绍神经网络

1943年,沃伦·麦卡洛克(Warren McCulloch)和沃尔特·皮茨(Walter Pitts)建立了首个神经元数学模型。在他们的研究论文A logical calculus of the ideas immanent in nervous activity中,描述了神经元的简单数学模型,它代表了神经系统中接受输入、处理输入并返回输出的单个细胞,该模型被称为McCulloch-Pitts神经模型。

神经网络是一种受人脑启发而执行特定任务或功能的算法,它需要通过学习的过程再来进行计算。神经网络包括一组连接的输入/输出单元,其中每个连接都有一个与之相关的权值。在学习阶段调整连接节点的权值拟合训练模型,在预测阶段对给定输入预测其正确分类标签。

人脑由数十亿处理信息的神经元细胞组成,每个神经元细胞被认为是一个简单的处理系统。神经元通过信号传递信息,它们相互连接形成生物神经网络,这种并行交互的系统使得大脑能够思考和处理信息。一个神经元的树突(Dendrites)接收另一个神经元的输入信号,并根据这些输入对另一个神经元的轴突(axon)输出响应。
人工神经网络算法实战教程_第1张图片

树突接收来自其他神经元的信号,细胞体将所有输入信号相加产生输出,当和达到阈值时轴突通过输出。突触(Synapse,来源于希腊语,意思是连接)是神经元相互作用的一个点,它向另一个神经元传递信号。
人工神经网络算法实战教程_第2张图片
其中 y = ∑ ( w e i g h t ∗ i n p u t ) + b i a s {∑(weight * input) + bias} (weightinput)+bias

这里的x1, x2 …… Xn是输入变量,w1 w2 …… Wn是各自输入的权重。b为偏置,与加权输入相加形成净输入,偏置和权值都是神经元的可调节参数。参数调整采用一定的学习规则。神经元的输出可以从负无穷到正无穷,神经元不知道边界,所以需要在神经元输入和输出之间有一个映射机制,这种映射机制称为激活函数。

前向和反向传播

人工神经网络主要有两类:前向传播和反向传播。前向传播神经网络非递归的网络,前一层神经元只与下一层神经元相连,它们不形成循环,信号仅向输出层单向传播。

反向传播神经网络包含循环,信号通过在网络中引入环路进行双向传播,从而导致网络行为基于输入信号随着时间推移而改变。反向传播神经网络又称循环神经网络。
人工神经网络算法实战教程_第3张图片

激活函数

激活函数用局部感应来定义神经元输出。激活函数给神经元引入了非线性因素,使得神经网络可以逼近任何非线性函数,让神经网络可以应用到众多的非线性模型中。下面介绍常用的几种激活函数:

  • 恒等函数:它总是返回和其输入相同的值。换句话说,恒等函数为函数f(x) = x,输入等于输出。

  • 阶跃函数:如果输出在特定阈值之上则输出为真(被激活),反之则输出假(没有被激活),作为分类器非常有用。

  • Sigmoid函数:是常见的S型函数,也称为S型生长曲线。Logistic函数和Tanh函数常用作Sigmoid函数。主要为输出值范围不同,一种输出范围为[0,1],另一种范围为[-1,1]。

  • 斜坡函数(ramp function):斜坡函数名称来源于其图形外观。它将负输入映射为0,将正输入映射为相同的输出。

  • ReLU函数:它是使用最多的激活函数。它将负输入映射为0,将正输入映射为相同的输出。
    人工神经网络算法实战教程_第4张图片

R 实现神经网络示例

首先需要安装加载neuralnet包,然后创建示例数据。

示例数据包括两类变量,特征变量和标签变量。特征变量包括知识技能和沟通交流两方面的得分,标签变量为二值标签(是否为尖子生)。为了简化,示例数据仅包括6条的数据。

tScore cScore topStu
20 90 1
10 20 0
30 40 0
20 50 0
80 50 1
20 80 1

下面代码主要实现神经网络分类模型,neuralnet函数的调用形式如下:

nn=neuralnet(topStu ~ tScore + cScore, data=df, hidden=3, act.fct = "logistic", linear.output = FALSE)

第一个参数指定标签和特征变量,data设置数据集,hidden指定隐藏层数量为3。
act.fct指定激活函数平滑结果;linear.output为False表示使用act.fct,设置True则不使用。

其他代码都加了注释,完整代码如下:

# 加载库
library(neuralnet)

# 创建示例数据
tScore <- c(20,10,30,20,80,30)
cScore <- c(90,20,40,50,50,80)
topStu <- c(1,0,0,0,1,1)

# 组合为数据框
df <- data.frame(tScore, cScore, topStu)

# 拟合神经网络模型
nn <- neuralnet(topStu ~ tScore + cScore, data=df, hidden=3, act.fct = "logistic", linear.output = FALSE)

# 画出神经网络图
plot(nn)

# 创建测试数据
tScore <- c(30, 40, 85)
cScore <- c(85, 50, 40)
test <- data.frame(tScore, cScore)

## 使用神经网络模型预测
Predict <- compute(nn, test)
Predict$net.result

# 转换输出概率为标签,阈值设置为0.5
prob <- Predict$net.result
pred <- ifelse(prob>0.5, 1, 0)
pred

人工神经网络算法实战教程_第5张图片

神经网络使用场景

神经网络更灵活,既可以用于回归问题,也可以用于分类问题。神经网络适合于图像等输入量较大的非线性数据集,神经网络可以处理任意数量的输入和层,神经网络采用并行方式执行。

当然也有很多替代算法,如支持向量机,决策树和回归算法,这些算法简单,快速,易于训练,并提供更好的性能。神经网络则是黑盒子,需要更多时间来训练模型,同时会占用更多计算能力;神经网络比其他机器学习算法需要更多样本数据,神经网络只能用于数值输入和非缺失值数据集。一位著名的神经网络研究者说: “神经网络是解决任何问题的第二好方法,最好的方法是真正理解问题所在。”

神经网络应用场景非常多,主要包括:

  • 模式识别: 神经网络非常适合用于人脸识别、目标检测、指纹识别等模式识别问题。

  • 异常检测: 神经网络擅长模式检测,它们可以很容易地检测出不符合一定模式的异常模式。

  • 时间序列预测: 神经网络可以用于预测时间序列问题,如股票价格,天气预报。

  • 自然语言处理: 神经网络在自然语言中有广泛的应用。

总结

恭喜你坚持读到结尾,给自己点个赞吧。本文介绍了神经网络的概念:前向和反向神经网络,激活函数等。并提供R语言实现示例以及神经网络的应用场景。希望你学习后能够应用神经网络算法分析自己的数据集,感谢阅读。

你可能感兴趣的:(机器学习,R语言,算法,机器学习,深度学习,神经网络)