反向传播算法的简单实现(不包括梯度检测,随机初始化)

一、参数
1. 输入层:X = 【x1,x2,x3,…xn
输入层表示特征的个数
2. 输出层:Y = 【y1,y2,y3,…yn
对于分类问题,输出层的个数为类别个数
3. 隐藏层
规则: 默认一层,隐藏层的单元数要比输入层的单元数多
若为多层,每层的单元数要相同,理论上每层的单元数越多越好,但单元数过多会导致计算量增大
4.学习率: θ,用于更新权重
5.迭代次数: numIter
6.图示
神经网络图示

二、前向传播算法
1. 目的: 用于计算除了输入层的每层的激励anumlayer
其中:
layer为从隐藏层开始的每一层,如:第一层隐藏层为anum(1)
num为该层的激励的序号,如:第一层隐藏层的第一个单元的激励为a1(1),第一层隐藏层的第二个单元的激励为a2(1),以此类推。
2. 计算每一层的激励
a1(1) = g(w10(1)x0 + w11(1)x1 + w12(1)x2) = g(z1(1))
a2(1) = g(w20(1)x0 + w21(1)x1 + w22(1)x2) = g(z2(1))
其中,
x0为偏置单元,是一个常量
w21(1)为权重,其下标表示第一层对第二层的权重
g()为激励函数,这里使用sigmoid函数作为激励函数
z1(1) = w10(1)x0 + w11(1)x1 + w12(1)x2)

三、反向传播算法
1. 目的: 计算误差项
2. 计算每一层的误差项
对于输出层: δ(2) = a(2) - Y
对于隐藏层: δ(1) = (w(1))Tδ(2) .* g(z(1)) - Y
其中:.表示点乘,即矩阵对应元素相乘(python中使用np.dot),其余为正常乘法(python中使用np.multipy)
g‘(z(1)) = a(1) .
* (1 - a(1))

四、权值更新
w <- w + θδ该层的输入

五、代码实现

import numpy as np
#定义激活函数
def sigmoid(x):
    return 1 / (1+np.exp(-x))
    
if __name__ == "__main__":
    x = [0.05,0.10]
    y = [0.01,0.99]
    b1 = 0.35
    b2 = 0.60
    w1 = [[0.15,0.20],[0.25,0.30]]
    w2 = [[0.40,0.45],[0.50,0.55]]

    theta = 0.5
    numIter = 10000

    #前向传播
    z1 = np.dot(w1,x) + b1
    a1 = sigmoid(z1)

    z2 = np.dot(w2,x) + b2
    a2 = sigmoid(z2)
    
    for n in range(numIter):
        #反向传播
        delta2 = a2 - y
        delta1 = np.multiply(np.dot(np.array(w2).T,delta2),np.multiply(a1,1-a1))

        #更新权重
        for i in range(len(w2)):
            w2[i] = w2[i] - theta * delta2[i] * a1

        for i in range(len(w1)):
            w1[i] = w1[i] - theta * delta1[i] * np.array(x)

        #继续向前传播输出结果
        z1 = np.dot(w1, x) + b1
        a1 = sigmoid(z1)

        z2 = np.dot(w2, x) + b2
        a2 = sigmoid(z2)

        print(str(n) + " result:" + str(a2[0]) + ", result:" + str(a2[1]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值