乐山企业品牌网站建设浦东新区建设局官方网站

当前位置: 首页 > news >正文

乐山企业品牌网站建设,浦东新区建设局官方网站,logo在线制作神器,建设com网站文章内容 感知机#xff08;Perceptron#xff09;反向传播算法#xff08;Back Propagation algorithm#xff09;RBF(Radial Basis Function#xff0c;径向基函数) 网络#xff1a;单一层前馈网络#xff0c;它使用径向基作为隐层神经元激活函数ART(Adaptive Resona…文章内容 感知机Perceptron反向传播算法Back Propagation algorithmRBF(Radial Basis Function径向基函数) 网络单一层前馈网络它使用径向基作为隐层神经元激活函数ART(Adaptive Resonance Theory自适应谐振理论) 网络竞争型学习无监督学习策略SOM(Self Organizing Map自组织映射) 网络竞争性学习型的无监督神经网络级联相关(Cascade-Correlation) 网络结构自适应网络Elman网络递归网络Boltzmann机一、 感知机Perceptron

  1. 含义 一个感知器有如下组成部分 输入权值一个感知器可以接收多个输入x每个输入上有一个权值w此外还有一个偏置项b就是上图中的。激活函数如阶跃函数Step functionsigmoid函数输出y f(wxb)权重更新其中η为学习率 单层感知机只能解决线性可分的问题。而多层感知器可以拟合任何的线性函数任何线性分类或线性回归问题都可以用感知器来解决。

  2. 更新方法 3. 代码 class Perceptron(object):def init(self, input_num, activator):初始化感知器设置输入参数的个数以及激活函数。激活函数的类型为double - doubleself.activator activator# 权重向量初始化为0self.weights [0.0 for _ in range(input_num)]# 偏置项初始化为0self.bias 0.0def str(self):打印学习到的权重、偏置项return weights\t:%s\nbias\t:%f\n % (self.weights, self.bias)def predict(self, input_vec):输入向量输出感知器的计算结果# 把input_vec[x1,x2,x3…]和weights[w1,w2,w3,…]打包在一起# 变成[(x1,w1),(x2,w2),(x3,w3),…]# 然后利用map函数计算[x1*w1, x2*w2, x3*w3]# 最后利用reduce求和return self.activator(reduce(lambda a, b: a b,map(lambda (x, w): x * w, zip(input_vec, self.weights)), 0.0) self.bias)def train(self, input_vecs, labels, iteration, rate):输入训练数据一组向量、与每个向量对应的label以及训练轮数、学习率for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):一次迭代把所有的训练数据过一遍# 把输入和输出打包在一起成为样本的列表[(input_vec, label), …]# 而每个训练样本是(input_vec, label)samples zip(input_vecs, labels)# 对每个样本按照感知器规则更新权重for (input_vec, label) in samples:# 计算感知器在当前权重下的输出output self.predict(input_vec)# 更新权重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):按照感知器规则更新权重# 把input_vec[x1,x2,x3,…]和weights[w1,w2,w3,…]打包在一起# 变成[(x1,w1),(x2,w2),(x3,w3),…]# 然后利用感知器规则更新权重delta label - outputself.weights map(lambda (x, w): w rate * delta * x,zip(input_vec, self.weights))# 更新biasself.bias rate * delta 训练和预测 def f(x):定义激活函数freturn 1 if x 0 else 0 def get_training_dataset():基于and真值表构建训练数据# 构建训练数据# 输入向量列表input_vecs [[1,1], [0,0], [1,0], [0,1]]# 期望的输出列表注意要与输入一一对应# [1,1] - 1, [0,0] - 0, [1,0] - 0, [0,1] - 0labels [1, 0, 0, 0]return input_vecs, labels
    def train_and_perceptron():使用and真值表训练感知器# 创建感知器输入参数个数为2因为and是二元函数激活函数为fp Perceptron(2, f)# 训练迭代10轮, 学习速率为0.1input_vecs, labels get_training_dataset()p.train(input_vecs, labels, 10, 0.1)#返回训练好的感知器return p if name main: # 训练and感知器and_perception train_and_perceptron()# 打印训练获得的权重print and_perception# 测试print 1 and 1 %d % and_perception.predict([1, 1])print 0 and 0 %d % and_perception.predict([0, 0])print 1 and 0 %d % and_perception.predict([1, 0])print 0 and 1 %d % and_perception.predict([0, 1]) 二、反向传播BP算法

  3. 内容 权重和偏差代价函数cost function均方误差权重更新梯度下降(gradient descent)策略更多优化方法正则化在误差目标函数中添加一个用于描述网络复杂度的部分如w²

  4. 参数计算与更新 2.1 总误差 2.2 误差在隐藏层反向传播输出层-隐藏层 以权重参数w5为例如果我们想知道w5对整体误差产生了多少影响可以用整体误差对w5求偏导求出链式法则  求三项偏导值 所以我们得到 可以取符号δ简化公式可选 最后更新权重w 2.3 误差反向传播隐藏层-隐藏层 方法差不多但要计算误差基于传递过来的之前的误差 该图中δ含义不一样只代表(target-out)的误差out(h1)会接受E(o1)和E(o2)两个地方传来的误差所以这个地方两个都要计算。 最后更新权重w1 总结前向传播和反向传播顺序说明图  3. 随机梯度更新和批量更新 批量batch更新时计算完一批样本后Δw再更新 批量梯度下降和随机梯度下降stochastic gradient descent对比  Mini-Batch 梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法每计算常数 次训练实例便更新一次参数。 在批量梯度下降算法中每次迭代我们都要使用到所有的m个样本在随机梯度下降中我们每次迭代只需要一个样本。Mini-batch算法具体来说就是每次迭代会使用b个样本这个b我们称为mini-batch大小的参数 3. 代码 #coding:utf-8 import random import math#

    参数解释

    pd_ 偏导的前缀

    d_ 导数的前缀

    w_ho 隐含层到输出层的权重系数索引

    w_ih 输入层到隐含层的权重系数的索引class NeuralNetwork:LEARNING_RATE 0.5def init(self, num_inputs, num_hidden, num_outputs, hidden_layer_weights None, hidden_layer_bias None, output_layer_weights None, output_layer_bias None):self.num_inputs num_inputsself.hidden_layer NeuronLayer(num_hidden, hidden_layer_bias)self.output_layer NeuronLayer(num_outputs, output_layer_bias)self.init_weights_from_inputs_to_hidden_layer_neurons(hidden_layer_weights)self.init_weights_from_hidden_layer_neurons_to_output_layer_neurons(output_layer_weights)def init_weights_from_inputs_to_hidden_layer_neurons(self, hidden_layer_weights):weight_num 0for h in range(len(self.hidden_layer.neurons)):for i in range(self.num_inputs):if not hidden_layer_weights:self.hidden_layer.neurons[h].weights.append(random.random())else:self.hidden_layer.neurons[h].weights.append(hidden_layer_weights[weight_num])weight_num 1def init_weights_from_hidden_layer_neurons_to_output_layer_neurons(self, output_layer_weights):weight_num 0for o in range(len(self.output_layer.neurons)):for h in range(len(self.hidden_layer.neurons)):if not output_layer_weights:self.output_layer.neurons[o].weights.append(random.random())else:self.output_layer.neurons[o].weights.append(output_layer_weights[weight_num])weight_num 1def inspect(self):print(——)print(* Inputs: {}.format(self.num_inputs))print(——)print(Hidden Layer)self.hidden_layer.inspect()print(——)print(* Output Layer)self.output_layer.inspect()print(——)def feed_forward(self, inputs):hidden_layer_outputs self.hidden_layer.feed_forward(inputs)return self.output_layer.feed_forward(hidden_layer_outputs)def train(self, training_inputs, training_outputs):self.feed_forward(training_inputs)# 1. 输出神经元的值pd_errors_wrt_output_neuron_total_net_input [0] * len(self.output_layer.neurons)for o in range(len(self.output_layer.neurons)):# ∂E/∂zⱼpd_errors_wrt_output_neuron_total_net_input[o] self.output_layer.neurons[o].calculate_pd_error_wrt_total_net_input(training_outputs[o])# 2. 隐含层神经元的值pd_errors_wrt_hidden_neuron_total_net_input [0] * len(self.hidden_layer.neurons)for h in range(len(self.hidden_layer.neurons)):# dE/dyⱼ Σ ∂E/∂zⱼ * ∂z/∂yⱼ Σ ∂E/∂zⱼ * wᵢⱼd_error_wrt_hidden_neuron_output 0for o in range(len(self.output_layer.neurons)):d_error_wrt_hidden_neuron_output pd_errors_wrt_output_neuron_total_net_input[o] * self.output_layer.neurons[o].weights[h]# ∂E/∂zⱼ dE/dyⱼ * ∂zⱼ/∂pd_errors_wrt_hidden_neuron_total_net_input[h] d_error_wrt_hidden_neuron_output * self.hidden_layer.neurons[h].calculate_pd_total_net_input_wrt_input()# 3. 更新输出层权重系数for o in range(len(self.output_layer.neurons)):for w_ho in range(len(self.output_layer.neurons[o].weights)):# ∂Eⱼ/∂wᵢⱼ ∂E/∂zⱼ * ∂zⱼ/∂wᵢⱼpd_error_wrt_weight pd_errors_wrt_output_neuron_total_net_input[o] * self.output_layer.neurons[o].calculate_pd_total_net_input_wrt_weight(w_ho)# Δw α * ∂Eⱼ/∂wᵢself.output_layer.neurons[o].weights[w_ho] - self.LEARNING_RATE * pd_error_wrt_weight# 4. 更新隐含层的权重系数for h in range(len(self.hidden_layer.neurons)):for w_ih in range(len(self.hidden_layer.neurons[h].weights)):# ∂Eⱼ/∂wᵢ ∂E/∂zⱼ * ∂zⱼ/∂wᵢpd_error_wrt_weight pd_errors_wrt_hidden_neuron_total_net_input[h] * self.hidden_layer.neurons[h].calculate_pd_total_net_input_wrt_weight(w_ih)# Δw α * ∂Eⱼ/∂wᵢself.hidden_layer.neurons[h].weights[w_ih] - self.LEARNING_RATE * pd_error_wrt_weightdef calculate_total_error(self, training_sets):total_error 0for t in range(len(training_sets)):training_inputs, training_outputs training_sets[t]self.feed_forward(training_inputs)for o in range(len(training_outputs)):total_error self.output_layer.neurons[o].calculate_error(training_outputs[o])return total_errorclass NeuronLayer:def init(self, num_neurons, bias):# 同一层的神经元共享一个截距项bself.bias bias if bias else random.random()self.neurons []for i in range(num_neurons):self.neurons.append(Neuron(self.bias))def inspect(self):print(Neurons:, len(self.neurons))for n in range(len(self.neurons)):print( Neuron, n)for w in range(len(self.neurons[n].weights)):print( Weight:, self.neurons[n].weights[w])print( Bias:, self.bias)def feed_forward(self, inputs):outputs []for neuron in self.neurons:outputs.append(neuron.calculate_output(inputs))return outputsdef get_outputs(self):outputs []for neuron in self.neurons:outputs.append(neuron.output)return outputsclass Neuron:def init(self, bias):self.bias biasself.weights []def calculate_output(self, inputs):self.inputs inputsself.output self.squash(self.calculate_total_net_input())return self.outputdef calculate_total_net_input(self):total 0for i in range(len(self.inputs)):total self.inputs[i] * self.weights[i]return total self.bias# 激活函数sigmoiddef squash(self, total_net_input):return 1 / (1 math.exp(-total_net_input))def calculate_pd_error_wrt_total_net_input(self, target_output):return self.calculate_pd_error_wrt_output(target_output) * self.calculate_pd_total_net_input_wrt_input();# 每一个神经元的误差是由平方差公式计算的def calculate_error(self, target_output):return 0.5 * (target_output - self.output) ** 2def calculate_pd_error_wrt_output(self, target_output):return -(target_output - self.output)def calculate_pd_total_net_input_wrt_input(self):return self.output * (1 - self.output)def calculate_pd_total_net_input_wrt_weight(self, index):return self.inputs[index]# 文中的例子:nn NeuralNetwork(2, 2, 2, hidden_layer_weights[0.15, 0.2, 0.25, 0.3], hidden_layer_bias0.35, output_layer_weights[0.4, 0.45, 0.5, 0.55], output_layer_bias0.6)

    for i in range(10000):nn.train([0.05, 0.1], [0.01, 0.09])print(i, round(nn.calculate_total_error([[[0.05, 0.1], [0.01, 0.09]]]), 9))#另外一个例子可以把上面的例子注释掉再运行一下:# training_sets [

    [[0, 0], [0]],

    [[0, 1], [1]],

    [[1, 0], [1]],

    [[1, 1], [0]]

    ]# nn NeuralNetwork(len(training_sets[0][0]), 5, len(training_sets[0][1]))

    for i in range(10000):

    training_inputs, training_outputs random.choice(training_sets)

    nn.train(training_inputs, training_outputs)

    print(i, nn.calculate_total_error(training_sets)) 三、SOM自组织映射网络

    SOM网络又称Kohonen网络是自组织竞争型神经网络的一种该网络为无监督学习网络能够识别环境特征并自动聚类。它通过自动寻找样本中的内在规律和本质属性自组织、自适应地改变网络参数与结构。

  5. SOM网络拓扑结构 网络包含两层即一个输入层和一个输出层输出层也称竞争层不包括隐层。输入层中的每个输入节点都与输出节点完全相连。输出节点呈二维结构分布且节点之间具有侧向连接。于是对某个输出节点来说在一定邻域范围内会有一定数量的“邻近细胞”即邻接节点。 2. 原理 分类与输入模式的相似性分类是在类别知识等导师信号的指导下将待识别的输入模式分配到各自的模式类中无导师指导的分类称为聚类聚类的目的是将相似的模式样本划归一类而将不相似的分离开来实现模式样本的类内相似性和类间分离性。由于无导师学习的训练样本中不含期望输出因此对于某一输入模式样本应属于哪一类并没有任何先验知识。对于一组输入模式只能根据它们之间的相似程度来分为若干类因此相似性是输入模式的聚类依据。相似性测量神经网络的输入模式向量的相似性测量可用向量之间的距离来衡量。常用的方法有欧氏距离法和余弦法两种。竞争学习原理:竞争学习规则的生理学基础是神经细胞的侧抑制现象当一个神经细胞兴奋后会对其周围的神经细胞产生抑制作用。最强的抑制作用是竞争获胜的“唯我独兴”这种做法称为“胜者为王”Winner-Take-All。竞争学习规则就是从神经细胞的侧抑制现象获得的。它的学习步骤为A、向量归一化B、寻找获胜神经元C、网络输出与权调整D、重新归一化处理。SOM网络的竞争调节策略优胜节点及邻接节点的更新3. 具体算法 网络学习过程中当样本输入网络时 竞争层上的神经元计算 输入样本与 竞争层神经元权值之间的 欧几里德距离距离最小的神经元为获胜神经元。调整获胜神经元和相邻神经元权值使获得神经元及周边权值靠近该输入样本。通过反复训练最终各神经元的连接权值具有一定的分布该分布把数据之间的相似性组织到代表各类的神经元上使同类神经元具有相近的权系数不同类的神经元权系数差别明显。需要注意的是在学习的过程中权值修改学习速率和神经元领域均在不断较少从而使同类神经元逐渐集中。 总的来说SOM网络包含初始化、竞争、迭代三块内容。 3.1 初始化 归一化数据集。设计竞争层结构。一般根据预估的聚类簇数进行设置。比如要分成4类那我可以将竞争层设计为2*21*44*1。SOM网络不需要预先提供聚类数量类别的数据由网络自动识别出来。预设竞争层神经元的权重节点。一般我们会根据输入数据的维度和竞争层预估的分类数来设置权重节点若输入为二维数据最终聚类为4类则权重矩阵就是2*4。初始化邻域半径、学习率。 3.2 竞争过程 随机选择样本根据权重节点计算到竞争层每个神经元节点的距离。一般我们选择欧式距离公式求距离。 (或者另一种方法权重w和输入x的点积最大判断优胜节点)选择优胜节点。通过竞争选择距离最小的神经元节点作为优胜节点。 Best Matching Unit(BMU) 优胜节点: The winner node(or weight) which has the shortest distance from itself to the sample vector. There are numerous ways to determine the distance, however, the most commonly used method is the Euclidean Distance, is the most common metric to calculate distance between weights and sample vector. 3.3 迭代过程 1、圈定出优胜邻域neighborhood内的所有节点。根据邻域半径圈定出距离小于邻域半径的节点形成优胜邻域。 2、对优胜邻域内的节点权重进行迭代更新。更新的思想是越靠近优胜节点更新幅度越大越远离优胜节点更新幅度越小故我们需要对不同的节点增加一个更新约束一般可以高斯函数求得。另外我们更新节点的目的是为了使得优胜节点更加逼近样本点故在节点权重的更新上我们采用以下公式 3.4 衰减函数 decay func SOM网络的另一个特点是学习率和邻域范围随着迭代次数会逐渐衰减 最常用的decay funciton是 1 / (1 t/T) sigma(t) sigma / (1 t/T) learning_rate(t) learning_rate / (1 t/T) t 代表当前迭代次数 T 总迭代次数 / 24. 实际例子 初始权重为w1 (0.45,0.89) , w2 (0.55,0.83) , w3 (0.95,0.32) 和 w4 (0.62,0.78) 。让四个神经元(N4)N1, N2, N3和N4分别位于直角坐标平面位置(0,0), (1,0), (1,0)和(1,1)的网格中。假设网络接受二维A2输入矢量x1x2。让w_i (w1_i,w2_i)为神经元i的权重 . neighborhood radius  0.6。输入向量X3,1。假设学习率0.5并且在整个过程中是恒定的。假设初始权重如图中所述。 5. 代码 References 零基础入门深度学习(1) - 感知器 - 作业部落 Cmd Markdown 编辑阅读器 一文弄懂神经网络中的反向传播法——BackPropagation Backpropagation 神经网络算法总结_晴晴_Amanda的博客-CSDN博客 批量梯度下降随机梯度下降mini-batch随机梯度下降对比说明 - 知乎 机器学习算法推导手写实现07——SOM网络 - 知乎 自组织映射神经网络SOM_意念回复的博客-CSDN博客 https://medium.com/analytics-vidhya/how-does-self-organizing-algorithm-works-f0664af9bf04