机器学习之单层感知机前向传播和反向传播

7 篇文章 0 订阅

前言
现如今机器学习非常火爆,闲来无事,看了下机器学习的相关书籍。最近对前向传播和反向传播做了一些总结归纳。当然这只是根据我个人的理解而定,如有出入,也请大家帮忙指正。

简单来说
对于单层感知机来说前项传播就是 y = wx+b 。可用如下图表示
在这里插入图片描述

反向传播就是 通过真实值和预测值的产生的误差返回去调整w和b的过程
用流程图来表示,如下
在这里插入图片描述

说到这里,正向传播就是y=wx+b,如此简单。
那么这个反向传播的这个loss如果得到呢?
在数据训练前我们会有 训练数据,我们叫输入值(就是x),初始值(w,b),预测标签(label)
那么用y = wx+b 就可以得到 预测值y。那么loss = label-y。

说完了前向传播,我们再来说说这个反向传播。
现在我们已经拿到了loss了,如何将w,b更新上去呢?
我们将初始的w,b 定义成w0,b0 ,现在我们要得到的是w1,b1 。
按照t度下降的规则,我们可以得到,其中rate为步长
W1 = W0-rate*( Loss对w求导 )
B1 = B0 - rate*(Loss对B求导)
其中Loss对w求导的细则可以自己试着推导下(其中就是运用了复合函数的求导法则),其推到结果如下
W1 = W0-rate * Loss * W0
B1 = B0-rate * Loss

那么我们的正向传播和反向传播算法就可以结合起来反复计算出W和B的最优解了

我们可以以最简单的与或运算来写代码实例

class neuron_tool(object):
    def __init__(self,init_weights,init_bais,active_func,rate):
        self.weights = init_weights
        self.bais = init_bais
        self.rate = rate
        self.func = active_func

    #输入input表示 [0,0]
    def forward(self,input):
        return input * self.weights  + self.bais

    #预测在外层包裹激活函数,wx
    def predict(self,input):
        return self.func( self.forward(input))

    #训练数据
    def train(self,dataset,times):
        inputs,labels = dataset
        for i in range(times):
            for input,label in zip(inputs,labels):
                output = self.predict(input)
                self.back_propagation(output,label)

    #根据w0,output,label,输入值 更新权重w1
    def back_propagation(self,output,label):
        loss = output - label
        self.weights = self.weights -  self.weights* loss  * self.rate
        self.bais = loss * self.rate




def active_fun(x):
    return 1 if x>=0.5 else 0

class dataset(object):

    def and_dataset(self):
        inputs = np.mat([[1, 1], [0, 0], [1, 0], [0, 1]])
        lables = [1, 0, 0, 0]
        return inputs,lables

    def or_dataset(self):
        inputs = np.mat([[1, 1], [0, 0], [1, 0], [0, 1]])
        lables = [1, 0, 1, 1]
        return inputs,lables

if __name__ == '__main__':
    #初始化权重
    weight = np.mat(np.ones((2, 1)))
    #初始化偏差
    bais = 0
    #初始化权重、偏差、激活函数、下降速度
    and_net = neuron_tool(weight,bais,active_fun,0.1)
    times = 1000
    and_net.train(dataset=dataset().and_dataset(),times=times)
    print('and [0,0] predict result is', and_net.predict([0,0]) )
    print('and [0,1] predict result is', and_net.predict([0,1]) )
    print('and [1,0] predict result is', and_net.predict([1,0]) )
    print('and [1,1] predict result is', and_net.predict([1,1]) )

    print('--------------------------------------------------')

    or_net = neuron_tool(weight,bais,active_fun,0.1)
    times = 1000
    or_net.train(dataset=dataset().or_dataset(),times=times)
    print('or [0,0] predict result is', or_net.predict([0,0]) )
    print('or [0,1] predict result is', or_net.predict([0,1]) )
    print('or [1,0] predict result is', or_net.predict([1,0]) )
    print('or [1,1] predict result is', or_net.predict([1,1]) )




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值