激活函数: tanh
bp反向传播
误差函数:MSE
from numpy import *
'''
layer = 神经元层数
number = 每层神经元个数
Input = w0*x0+....+wi*xi
f = 激活函数
Out = f(Input) 节点输出值
PartialDerivation = 节点偏导(每一个神经元的偏导)
PartialThreashold = 权值偏导(每一个权值的偏导)
ThreasholdVaule = 权值
f1 = 每一个节点对下一个节点的倒数函数(直接输出值)
LearnRating = 学习率
'''
data2 = [[2, 2], [0.5], [1, 1], [0.25]] #data2就是输入和期望输出
layer = 2 #可更改
number = 2 #可更改
time = 0
c = 0
error1 = 0
alltime = 20000 #训练次数
LearnRating = 0.001
Out = zeros((layer, number), dtype=float)
Input = zeros((layer, number), dtype=float)
Out1 = zeros((layer, number), dtype=float)
Input1 = zeros((layer, number), dtype=float)
PartialDerivation = zeros((layer, number, number), dtype=float)
PartialThreshold = zeros((layer, number, number), dtype=float)
Partial = zeros((layer, number), dtype = float )
node = zeros((number, number), dtype=float )
f1 = zeros((layer, number), dtype=float)
a = zeros(number, dtype=float)
ThresholdVaule = random.rand(layer, number, number)
Constant = random.rand(layer, number)
end = zeros(number, dtype=float)
def f(Input): #激活函数,这个用的是函数
return (e**(Input)-e**(-Input))/(e**(Input)+e**(-Input))
def Partial1(Input): #激活函数求导,
return 1-f(Input)**2
while 1:
#正向传播
Input[0] = data2[c]
for i in range(0, layer-1):
Out[i] = f(Input[i]) ##f(x)
Input[i+1] = dot(ThresholdVaule[i], Out[i])+Constant[i] ## layer[i+1] x
Out[layer-1] = f(Input[layer-1])
error = sum(Out[layer-1]/layer)-data2[c+1]
#逆向传播
for i in range(len(end)):
end[i] = (sum(Out[layer-1])/layer - data2[c+1][0])/layer
PartialDerivation[layer-1] = diag(end) #sum(Out[layer-1])/5-data2[c+1]
i = layer-2
f1 = Partial1(Input)
while i >= 0:
node = dot(dot(PartialDerivation[i+1], diag(f1[i+1])), ThresholdVaule[i]) #核心代码:求每个神经元的偏导
a = sum(node, axis=0)
PartialDerivation[i] = diag(a)
for j in range(0, number):
node[j] = Out[i]
PartialThreshold[i] = dot(dot(diag(f1[i+1]), PartialDerivation[i+1]), node) #核心代码:求权值的偏导
i = i-1
ThresholdVaule = ThresholdVaule-PartialThreshold*LearnRating
for j in range(0, layer):
Constant[j] = Constant[j] - diag(PartialDerivation[j])*LearnRating
Input1[0] = data2[c]
for i in range(0, layer-1):
Out1[i] = f(Input1[i])
Input1[i+1] = dot(ThresholdVaule[i], Out1[i])+Constant[i]
Out1[layer-1] = f(Input1[layer-1])
if c==0:
c = 2
else:
c = 0
基本上没任何编程技术含量,重点是理论的理解及实现
就是这两句,其他都是粪土
node = dot(dot(PartialDerivation[i+1], diag(f1[i+1])), ThresholdVaule[i])
PartialThreshold[i] = dot(dot(diag(f1[i+1]), PartialDerivation[i+1]), node)
本来就这些了,防止本垃圾以后自己看不懂,解释下。
神经网络的本质,是用神经网络本身这个函数去契合(模拟)任意一个函数
契合的意义:使两个函数的相似度越来越大(越来越像)
契合的方法:相似度度量函数的导数就是使得两个函数最接近的路径
后面是具体解释:
**神经网络的本质,是用神经网络本身这个函数去契合(模拟)任意一个函数**。(为什么神经网络可以
模拟任何一个函数,听说有论文证明,没看过。但这符合我的世界观,无论多复杂都可以用简单来解释)
然后**解释任意一个函数是什么意思**: y = f( x ) 就是函数,太数学了,换个说法,有一个输入,
就有对应的一个输出,就是函数,再具体,这个输出可以是任何东西,大自然的任何东西,
一沙一树一世界,一花一叶一菩提,都可以,然后给你一个你想要的输出。输出的形式自然
可以是任何东西,应用不是数学,输入输出自然不可能有限制。那牛逼吹出去了,怎么实现呢。
数学里的输入只能是数字,计算机的输入只能是数据。把目标输入属性用数据描述就好了,最常见
的属性应该是人的五感对应的属性。然后用神经网络的输出与目标(理想)输出进行对比,经过**一定
的方法**使二者靠近最后甚至一毛一样
然后问题来了,神经网络说到底就是模仿吗,我已经有一个正确的模型了(不然我怎么有正确的输出),
为什么花这么大的功夫搞一个复制品。直接用正品不好吗。一步到wei(有点长了)如果淘宝模拟出买家大部分
性格呢,如果手机里有一个软件有权利记录你所有的踪迹,且进行模拟,当同样的输入传递给你和它,
你两的输出一致率达到80%,求这个软件的发财程度。
说明了神经网络的能力与能否再现实社会存在,再说神经网络实现难点。算力不够,没了。就这个,
足够的算力下是不需要任何算法的,请直接穷举。那怎么在算力有限的情况下实现最大的功能呢。
联想到一个相似的问题:怎么算一个硬币的正反两面概率呢(正反两面概率不一样的情况)。两个理论方法,
一:把硬币的所有属性,环境,抛硬币的力等等进行建模,算出来
二:把这枚硬币抛无穷次
实际方法:抛一百次,频率代替概率(样本数量越大,频率越接近概率)。
同样的方法:算力有限的情况,用最大的可算样本代替总体,进行神经网络训练(使神经网络越来越靠近
模仿的函数)。然后训练方法呢,**相似度度量**。相似度度量函数就是二者之间的误差,相似度函数的导数方向
就是最快相似的方向