Python实现神经网络Part 1: 实现forward和BP算法的神经元

本文是《Python实现神经网络》系列的第一部分,旨在通过编程实践深入理解神经网络的前向传播和误差反向传播算法。作者在GitHub上分享了实现神经元对象的代码,包括激活函数、反向梯度计算和权重调整。虽然单元测试显示参数能收敛,但未达到最优解,提出可能存在训练样本不足或梯度下降算法局限性的问题。
摘要由CSDN通过智能技术生成

主旨和本系列目录

《Python实现神经网络》是一个文章系列,目的在于:通过实际编写程序,加深对神经网络所涉及的各类算法的理解。动机描述详见“本系列动机”部分。

截止目前本系列已完成部分目录如下

本系列文章对应的代码在我的GitHub上SimpleNeuralNetwork项目中

本系列动机

在学习深度学习理论过程中,由神经元(节点)组成的多层全连接神经网络是最基础的概念,如下图所示[1]。
这里写图片描述

这样一个神经网络要发挥作用,必须有算法支持,这其中包括前向(forward)结果计算,也包括误差反向传播(Backward Propagation, BP),还有基于梯度的参数训练等。

在我自己在学习和应用这些算法的过程中,面临这样一种状况:一方面,理论教材(例如周志华教授的西瓜书以及网络上浩如烟海的资料)从单个神经元开始详细讲解了上述算法的数学原理;另一方面,在目前流行的深度学习框架,例如TensorFlow中,这些功能已经被良好封装,只要调用正确的API就可以实现。这样,学到的数学原理在框架调用中并不能直观的感觉到,虽然已经能用神经网络解决一些问题,但是对于算法基础原理的理解仍然不够深入。

源于此,我开始尝试用代码实现神经网络,希望通过这样的方式加深对神经网络原理性的理解,在今后的工作中更清楚框架(例如TensorFlow)中API的特性与局限。

源代码位置

我的GitHubSimpleNeuralNetwork项目中NeuralNode.py

神经元的软件设计

在设计中,存在以下假设

  1. 神经元与前一级iDims个节点有连接,iDims >=0且iDims为整数
  2. 神经元的输入为1*iDims的向量,记为x
  3. 神经元的激活函数为Sigmoid Funcrion

从软件的角度,神经元可以抽象为一个对象,此对象包含以下成员

  1. 权重向量 weight : shape =1*iDims,用于保存与前一级iDims个连接中每个连接的权重
  2. 偏置量 bias :这是一个标量,用于记录偏置值
  3. 输入向量 x⃗ 
  4. 激活函数的输入值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值