上海 专业网站建设,网络推广公司收费标准,不用域名也可以做网站,帮人做分销网站违法么目录
神经网络的介绍
神经网络的组成
神经网络的工作原理
Numpy 实现神经元
Numpy 实现前向传播
Numpy 实现一个可学习的神经网络 神经网络的介绍
神经网络受人类大脑启发的算法。简单来说#xff0c;当你睁开眼睛时#xff0c;你看到的物体叫做数据#xff0c;再由你…
目录
神经网络的介绍
神经网络的组成
神经网络的工作原理
Numpy 实现神经元
Numpy 实现前向传播
Numpy 实现一个可学习的神经网络 神经网络的介绍
神经网络受人类大脑启发的算法。简单来说当你睁开眼睛时你看到的物体叫做数据再由你大脑中处理数据的 Nuerons细胞操作识别出你所看到的物体这是神经网络的工作过程。人工神经网络Artificial Neural NetworkANN它们不像你大脑中的神经元一样操作而是模拟神经网络的性质和功能。
神经网络的组成
人工神经网络由大量高度相互关联的处理单元神经元协同工作来解决特定问题。首先介绍一种名为感知机的神经元。感知机接收若干个输入每个输入对应一个权重值可以看成常数用它们做一些数学运算然后产生一个输出。 接下来用形象化的例子解释感知机假设有一个计划周末去徒步影响计划是否进行的因素有这些 1周末是否加班 2周末的天气是否恶劣 3往返徒步地点是否方便 对于不同人三个因素的影响效果也不一样如果 输入2对于你来说影响非常大这样就设置的权重值就大反之权重值就小。
再将输入二值化对于天气不恶劣设置为 1对于天气恶劣设置为 0天气的影响程度通过权重值体现设置为 10。同样设置输入1的权值为 8输入3的权重值为 1。输出二值化是去徒步为 1不去为 0。
假设对于感知机如果 的结果大于某阈值如 5表示去徒步 随机调整权重感知机的结果会不一样。
一个典型的神经网络有成百上千个神经元感知机排成一列的神经元也称为单元或是层每一列的神经元会连接左右两边的神经元。感知机有输入和输出对于神经网络是有输入单元与输出单元在输入单元和输出单元之间是一层或多层称为隐藏单元。一个单元和另一个单元之间的联系用权重表示权重可以是正数如一个单元激发另一个单元 也可以是负数如一个单元抑制或抑制另一个单元。权重越高一个单位对另一个单位的影响就越大。 神经网络的工作原理
神经网络的工作大致可分为前向传播和反向传播类比人们学习的过程
前向传播如读书期间学生认真学习知识点进行考试获得自己对知识点的掌握程度
反向传播是学生获得考试成绩作为反馈调整学习的侧重点。
以下展示了 2 个输入和 2 个输出的神经网络 大多数真实世界的数据是非线性的我们希望神经元学习这些非线性表示可以通过激活函数将非线性引入神经元。例如徒步例子中的阈值激活函数 ReLURectified Linear Activation Function的阈值为 0对于大于 0 的输入输出为输入值对于小于 0 的输入值输出为 0公式和图像表示如下 这里扩展一下激活函数有很多种例如常用的 sigmoid 激活函数只输出范围内的数字 它将无界输入转换为具有良好、可预测的输出形式sigmoid 函数的公式和图像如下。 加入 ReLU 激活函数的神经网络如下图所示 加入 SoftMax 函数的神经网络如下图所示 获得神经网络的输出值 (0.98, 0.02) 之后与真实值 (1, 0) 比较非常接近仍然需要与真实值比较计算差距也称误差用 e表示就跟摸底考试一样查看学习的掌握程度同样神经网络也要学习让输出结果无限接近真实值也就需要调整权重值这里就需要反向传播了。 在反向传播过程中需要依据误差值来调整权重值可以看成参数优化过程简要过程是先初始化权重值再增加或减少权重值查看误差是否最小变小继续上一步相同操作变大则上一步相反操作调整权重后查看误差值直至误差值变小且浮动不大。 斜率的大小表明变化的速率意思是当斜率比较大的情况下权重 变化所引起的结果变化也大。把这个概念引入求最小化的问题上以权重导数乘以一个系数作为权重更新的数值这个系数我们叫它学习率(learning rate)这个系数能在一定程度上控制权重自我更新权重改变的方向与梯度方向相反如下图所示权重的更新公式如下 import numpy as npdef mse-loss(y_true, y_pred):# y_true and y_pred are numpy arrays of the same length.return ((y_true - y_pred) ** 2).mean()y_true np.array([1, 0, 0, 1])
y_pred np.array([0, 0, 0, 0])print(mse_loss(y_true, y_pred)) # 0.5Numpy 实现神经元
以上介绍了神经网络的基本结构及数学原理为了方便大家理解参数围绕着 后续继续深入学习便遇到 参数称为偏差神经元会有以下这样的形式。 Python 代码实现如下
import numpy as npdef 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 weightsself.bias biasdef feedforward(self, inputs):# Weight inputs, add bias, then use the activation functiontotal np.dot(self.weights, inputs) self.biasreturn 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.9990889488055994Numpy 实现前向传播
同样在神经网络中如下图所示这个网络有 2 个输入一个隐藏层有 2 个神经元 和 和一个有 1 个神经元的输出层。 输出如下 Python 代码实现如下
import numpy as npclass 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 0def __init__(self):weights np.array([0, 1])bias 0# The Neuron class here is from the previous sectionself.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 h2out_o1 self.o1.feedforward(np.array([out_h1, out_h2]))return out_o1network OurNeuralNetwork()
x np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421Numpy 实现一个可学习的神经网络
终于到了实现一个完整的神经网络的时候了把参数全安排上别吓着了~ 现在有一个明确的目标最小化神经网络的损将损失写成多变量函数其中 。 变量多的时候求其中一个变量的导数时成为求偏导数接下来求 的偏导数公式如下 橙色框的内容关于损失函数可以直接得到 绿色框的内容继续分析 : 只影响 不影响 绿色框的内容拆解为 最终关于 的偏导数公式如下 为了便于大家理解将公式放在一起请查阅~ 这里会对 sigmoid 函数求导求导的结果如下 获得偏导数后回忆一下参数的更新公式
学习率偏导数 如果偏导数为正则参数减少 如果偏导数为负则参数增加。
如果我们对网络中的每个权重和偏差都这样做损失将慢慢减少。
整个过程如下 1.从我们的数据集中选择一个样本进行操作 2.计算损失中关于权重和偏差的偏导数 3.使用更新公式更新每个权重和偏差 4.回到步骤1