首页 > 其他分享 >深度学习之路一 前向反馈和反向传播的初步雏形

深度学习之路一 前向反馈和反向传播的初步雏形

时间:2023-03-25 22:23:35浏览次数:40  
标签:lossTmp 0.01 雏形 反向 w2 w1 print 前向 4.9517

#coding: utf8
import math
# x1, x2输入神经元
x1=1
x2=2
# w1,w2分别为x1,x2的权重
w1=0.2
w2=0.3
# b为输出神经元的偏移量
b = 0.1
target = 1 # 目标值

def f(w1, w2, b):
    return x1 * w1 + x2 * w2+ b

def loss(x, target):
    return (target - x) ** 2

def printInfo():
    print('w1:', w1)
    print('w2:', w2)
    print('b:', b)
    o1 = f(w1, w2, b)
    print('f(w1, w2, b):', o1)
    o1 = math.tanh(o1)
    print('激活输出:', o1)
    print('损失值:', loss(o1, target))
    print('----------------')

printInfo()

# 核心问题:如果降低损失? 其实就是让损失函数的输出变小
# 那么就变成数学题了,如何求一个函数的极小值
# 数学理论:
# 要求一个函数的极小值,可以使用求导数的方法,具体步骤如下:

# 1. 对函数进行求导,得到其导函数。
# 2. 将导函数等于0的解作为函数的极值。
# 3. 判断左正右负极大值,左负右正极小值

# 根据上面的步骤操作
# 第1步: loss 的导函数
def lossGrad(x):
    # return -2*(1-x)
    return 2*x-2

# 第2步 lossGrad(x) = 0  ->解得 x = 1
# 第3步 lossGrad(0)=-2   lossGrad(2)=2  属于左负右正极小值,那么x=1时loss函数有极小值
# 其实第三步还有一个小技巧,就是对lossGrad再次求导,得到常数2。 大于0就是极小值。 不懂的同学可以补习下这块知识

# 回到核心问题,如果降低损失? 目标变成了怎么让x=1. 即怎么让tanh的值为1, 可惜tanh的值域不包括1, 那么我们尽可能接近它
# 我们求反函数就可以知道,math.atanh(0.9999) = 4.9517
# 现在问题就又变成了 如何让 x1*w1 + x2*w2 + b = 4.9517
# 其实就是怎么调整 w1 w2 和 b 三个变量的值,使其尽可能输出向4.9517靠拢

# 目标:f(w1, w2, b) = 4.9517   看到这个玩意我知道有很多解,但是没法直接求,所以只能一点一点迭代接近它了。后面训练网络模型的时候其实就是调整所有的w和b
# 一个三元函数怎么接近这个4.9517它, 又变成一个数学问题, 求这个三元函数的导函数(也就是偏导数)
# 这个分别求导得到:
def fGradW1():
    return x1

def fGradW2():
    return x2

def fGradB():
    return 1

# 根据求导结果可知,导函数都是常数
# 当前的损失值
lossTmp = f(w1, w2, b) - 4.9517
print('当前损失值:', lossTmp)
w1 = w1 - 0.01 * fGradW1() * lossTmp
w2 = w2 - 0.01 * fGradW2() * lossTmp
b = b - 0.01 * fGradB() * lossTmp
lossTmp = f(w1, w2, b) - 4.9517
print('当前损失值:', lossTmp)
w1 = w1 - 0.01 * fGradW1() * lossTmp
w2 = w2 - 0.01 * fGradW2() * lossTmp
b = b - 0.01 * fGradB() * lossTmp
lossTmp = f(w1, w2, b) - 4.9517
print('当前损失值:', lossTmp)
w1 = w1 - 0.01 * fGradW1() * lossTmp
w2 = w2 - 0.01 * fGradW2() * lossTmp
b = b - 0.01 * fGradB() * lossTmp
lossTmp = f(w1, w2, b) - 4.9517
print('当前损失值:', lossTmp)
w1 = w1 - 0.01 * fGradW1() * lossTmp
w2 = w2 - 0.01 * fGradW2() * lossTmp
b = b - 0.01 * fGradB() * lossTmp
lossTmp = f(w1, w2, b) - 4.9517
print('当前损失值:', lossTmp)

printInfo()
# 从前面几次迭代可以看出,损失值在不断减小
# 现在把这个迭代过程分装成一个函数
def train(n):
    global w1, w2, b
    for i in range(n):
        lossTmp = f(w1, w2, b) - 4.9517
        w1 = w1 - 0.01 * fGradW1() * lossTmp
        w2 = w2 - 0.01 * fGradW2() * lossTmp
        b = b - 0.01 * fGradB() * lossTmp

train(100)
printInfo()

 

 从结果看出已经损失值已经无限接近0了, 还是非常完美,  这个是数学分析后,一点一点拼凑出来的代码,下一篇将对这个代码进行归纳

标签:lossTmp,0.01,雏形,反向,w2,w1,print,前向,4.9517
From: https://www.cnblogs.com/dzqdzq/p/17255765.html

相关文章

  • 人工神经网络ANN中的前向传播和R语言分析学生成绩数据案例|附代码数据
    全文链接:http://tecdat.cn/?p=19936最近我们被客户要求撰写关于人工神经网络ANN的研究报告,包括一些图形和统计输出。在本教程中,您将学习如何在R中创建神经网络模型这里......
  • R语言无套利区间模型:正向套利和反向套利次数、收益率分析华泰柏瑞300ETF可视化
    全文链接:http://tecdat.cn/?p=31973原文出处:拓端数据部落公众号股指期货的套利交易有助于股指期货实现其价格发现以及风险规避的功能,因此提高套利交易的效率,对于发挥股......
  • 链式前向星
    publicclass链式前向星{ publicstaticvoidmain(String[]args){ add(1,3,5); add(1,2,4); add(1,5,8); visit(1); } staticintN=1005; sta......
  • 2.7、2.8前向后向传播
    蓝色线前向传播(从左到右)大致过程反向传播:如果要计算dj/dv由j=3v得当v由11变成11.001时,j由33变成33.003,对于任意的v的变化量,j变成原来的3倍,因此dj/dv的导数为3如果要计......
  • nginx反向代理出现404
    #nginx主要还是配置nginx.conf如果你配置的nginx反向代理有问题,导致无法加载css,js等内容那么,你可以先把你添加的内容先干掉,加上如下所示内容,或者参考如下胚子信息upstream......
  • [Unraid 系列 v6.10+] 3 NGINX 反向代理 UNRAID webterminal 实现刷新异常处理
    说明我发现Nginx反向代理Unraid后,每分钟webterminal/ttyd/都会刷新一次,此前所有有关行为和显示都将清空。原因后来经过Chrome的DevTools检查查看Network项,......
  • 正向代理和反向代理的区别
    1、正向代理正向代理是基于客户端的代理,其用意就跟家用光猫一样,你的所有请求都是通过光猫,再由光猫进行转发请求,这就是正向代练,可以让你的真实ip地址隐藏掉,服务端没办......
  • nginx配置反向代理
         通过docker-compose安装nginx docker-composeup-dnginx 将容器内配置文件卷出来修改nginx/nginx.confusernginx;worker_processes1......
  • 正反向代理
    什么是代理?代理其实就是一个中介,A和B本来可以直接连接,这个时候中间插入一个C,C就是中介刚开始的时候,代理多数是帮助内网客户端访问外网服务端后来出现了反向代理,'反......
  • 禁用反向域名解析与性能优化
    linux中ping延时过高,可以加-n参数:ping-n-c3geektime.org mysql中,是在连接器部分做设置:vi/etc/my.cnf在[mysqld]的段中加上一句:skip-name-resolve 什么是DNSPT......