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

怎么用div做网站seo推广要多少钱

怎么用div做网站,seo推广要多少钱,专业做简历找什么店,织梦装修设计网站模板昇思25天学习打卡营第7天|网络构建 前言函数式自动微分函数与计算图微分函数与梯度计算Stop GradientAuxiliary data神经网络梯度计算 个人任务打卡(读者请忽略)个人理解与总结 前言 非常感谢华为昇思大模型平台和CSDN邀请体验昇思大模型!从今…

昇思25天学习打卡营第7天|网络构建

  • 前言
  • 函数式自动微分
    • 函数与计算图
    • 微分函数与梯度计算
    • Stop Gradient
    • Auxiliary data
    • 神经网络梯度计算
  • 个人任务打卡(读者请忽略)
  • 个人理解与总结

前言

  非常感谢华为昇思大模型平台和CSDN邀请体验昇思大模型!从今天起,笔者将以打卡的方式,将原文搬运和个人思考结合,分享25天的学习内容与成果。为了提升文章质量和阅读体验,笔者会将思考部分放在最后,供大家探索讨论。同时也欢迎各位领取算力,免费体验昇思大模型!

函数式自动微分

神经网络的训练主要使用反向传播算法,模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss,然后进行反向传播计算,求得梯度(gradients),最终更新至模型参数(parameters)。自动微分能够计算可导函数在某点处的导数值,是反向传播算法的一般化。自动微分主要解决的问题是将一个复杂的数学运算分解为一系列简单的基本运算,该功能对用户屏蔽了大量的求导细节和过程,大大降低了框架的使用门槛。

MindSpore使用函数式自动微分的设计理念,提供更接近于数学语义的自动微分接口gradvalue_and_grad。下面我们使用一个简单的单层线性变换模型进行介绍。

%%capture captured_output
# 实验环境已经预装了mindspore==2.3.0rc1,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.3.0rc1
import numpy as np
import mindspore
from mindspore import nn
from mindspore import ops
from mindspore import Tensor, Parameter

函数与计算图

计算图是用图论语言表示数学函数的一种方式,也是深度学习框架表达神经网络模型的统一方法。我们将根据下面的计算图构造计算函数和神经网络。

compute-graph
在这个模型中, x x x为输入, y y y为正确值, w w w b b b是我们需要优化的参数。

x = ops.ones(5, mindspore.float32)  # input tensor, 生成5*5的全1矩阵,其元素类型均为float32
y = ops.zeros(3, mindspore.float32)  # expected output,生成3*3的全0矩阵,其元素类型均为float32
w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight, 生成5*3的随机矩阵,其元素类型均为float32
b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias,生成3*1的随机矩阵,其元素类型均为float32

我们根据计算图描述的计算过程,构造计算函数。
其中,binary_cross_entropy_with_logits 是一个损失函数,计算预测值和目标值之间的二值交叉熵损失。

def function(x, y, w, b):z = ops.matmul(x, w) + b #z=x矩阵相乘w + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))#使用二值交叉熵损失计算z和y之间的损失return loss

执行计算函数,可以获得计算的loss值。

loss = function(x, y, w, b)
print(loss)

在这里插入图片描述

微分函数与梯度计算

为了优化模型参数,需要求参数对loss的导数: ∂ loss ⁡ ∂ w \frac{\partial \operatorname{loss}}{\partial w} wloss ∂ loss ⁡ ∂ b \frac{\partial \operatorname{loss}}{\partial b} bloss,此时我们调用mindspore.grad函数,来获得function的微分函数。

这里使用了grad函数的两个入参,分别为:

  • fn:待求导的函数。
  • grad_position:指定求导输入位置的索引。

由于我们对 w w w b b b求导,因此配置其在function入参对应的位置(2, 3)

使用grad获得微分函数是一种函数变换,即输入为函数,输出也为函数。

grad_fn = mindspore.grad(function, (2, 3))#计算待求导的函数中w和b的梯度值

执行微分函数,即可获得 w w w b b b对应的梯度。

grads = grad_fn(x, y, w, b) 
print(grads)

在这里插入图片描述

Stop Gradient

通常情况下,求导时会求loss对参数的导数,因此函数的输出只有loss一项。当我们希望函数输出多项时,微分函数会求所有输出项对参数的导数。此时如果想实现对某个输出项的梯度截断,或消除某个Tensor对梯度的影响,需要用到Stop Gradient操作。

这里我们将function改为同时输出loss和z的function_with_logits,获得微分函数并执行。

def function_with_logits(x, y, w, b):z = ops.matmul(x, w) + b	#z=x矩阵相乘w + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))#使用二值交叉熵损失计算z和y之间的损失return loss, z
grad_fn = mindspore.grad(function_with_logits, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)

在这里插入图片描述
可以看到求得 w w w b b b对应的梯度值发生了变化。此时如果想要屏蔽掉z对梯度的影响,即仍只求参数对loss的导数,可以使用ops.stop_gradient接口,将梯度在此处截断。我们将function实现加入stop_gradient,并执行。

def function_stop_gradient(x, y, w, b):z = ops.matmul(x, w) + b	#z=x矩阵相乘w + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))#使用二值交叉熵损失计算z和y之间的损失return loss, ops.stop_gradient(z)
grad_fn = mindspore.grad(function_stop_gradient, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)

在这里插入图片描述
可以看到,求得 w w w b b b对应的梯度值与初始function求得的梯度值一致。

Auxiliary data

Auxiliary data意为辅助数据,是函数除第一个输出项外的其他输出。通常我们会将函数的loss设置为函数的第一个输出,其他的输出即为辅助数据。

gradvalue_and_grad提供has_aux参数,当其设置为True时,可以自动实现前文手动添加stop_gradient的功能,满足返回辅助数据的同时不影响梯度计算的效果。

下面仍使用function_with_logits,配置has_aux=True,并执行。

grad_fn = mindspore.grad(function_with_logits, (2, 3), has_aux=True)
grads, (z,) = grad_fn(x, y, w, b)
print(grads, z)

在这里插入图片描述
可以看到,求得 w w w b b b对应的梯度值与初始function求得的梯度值一致,同时z能够作为微分函数的输出返回。

神经网络梯度计算

前述章节主要根据计算图对应的函数介绍了MindSpore的函数式自动微分,但我们的神经网络构造是继承自面向对象编程范式的nn.Cell。接下来我们通过Cell构造同样的神经网络,利用函数式自动微分来实现反向传播。

首先我们继承nn.Cell构造单层线性变换神经网络。这里我们直接使用前文的 w w w b b b作为模型参数,使用mindspore.Parameter进行包装后,作为内部属性,并在construct内实现相同的Tensor操作。

# Define model
class Network(nn.Cell):def __init__(self):super().__init__()self.w = wself.b = bdef construct(self, x):z = ops.matmul(x, self.w) + self.b	#z=x矩阵相乘w + breturn z

接下来我们实例化模型和损失函数。

# Instantiate model
model = Network()				#实例化模型
# Instantiate loss function
loss_fn = nn.BCEWithLogitsLoss()	#计算二元交叉熵损失函数

完成后,由于需要使用函数式自动微分,需要将神经网络和损失函数的调用封装为一个前向计算函数。

# Define forward function
def forward_fn(x, y):# 定义前向推理z = model(x)loss = loss_fn(z, y)return loss

完成后,我们使用value_and_grad接口获得微分函数,用于计算梯度。

由于使用Cell封装神经网络模型,模型参数为Cell的内部属性,此时我们不需要使用grad_position指定对函数输入求导,因此将其配置为None。对模型参数求导时,我们使用weights参数,使用model.trainable_params()方法从Cell中取出可以求导的参数。

grad_fn = mindspore.value_and_grad(forward_fn, None, weights=model.trainable_params())#获得微分函数,从cell取出可以求导的参数
loss, grads = grad_fn(x, y)
print(grads)

在这里插入图片描述
执行微分函数,可以看到梯度值和前文function求得的梯度值一致。

个人任务打卡(读者请忽略)

在这里插入图片描述

个人理解与总结

本章节主要介绍了昇思大模型中函数式自动微分的主要功能,包括函数与计算图、微分函数与梯度计算、停止梯度计算(Stop Gradient)、辅助数据(Auxiliary data)和神经网络梯度计算及它们对搭建深度神经网络模型的作用。该章节通过搭建简单的深度学习模型(y=w*x+b),通过计算预测值和目标值之间的二值交叉熵损失计算loss;使用mindspore.grad计算梯度,使用ops.stop_gradient停止梯度计算,最后使用Cell搭建深度神经网络,使用model.trainable_params()计算可求导的参数。综上所述,昇思大模型为深度神经网络中梯度和损失的计算提供了基础且便捷的解决方案。

http://www.15wanjia.com/news/34917.html

相关文章:

  • 电商平台网站建设360网址导航
  • 做网站怎样做才有百度快照荥阳网络推广公司
  • html情人节给女朋友做网站四年级写一小段新闻
  • 给公司做网站需要多少钱seo排名推广
  • wordpress编辑器没有编辑框杭州网站优化服务
  • 乐歌股份摄像头深圳seo网络优化公司
  • 建工厂网站的公司做一个公司网站需要多少钱
  • 珠海金泉做网站号公司或个人码网络营销的发展前景
  • 万维网站建设做竞价推广大概多少钱
  • 做网站好的网站建设公司百度广告推广平台
  • 网站建设的技术手段google 浏览器
  • 做关于什么样的网站好百度软件下载
  • 重庆网站价格青岛官网seo方法
  • 寻找销售团队外包沈阳seo搜索引擎
  • 自己主机做网站服务器吗seo课堂
  • 制作一个网站平台吗如何做一个自己的网站呢
  • 多图片ppt页面设计seo资讯
  • 打造公司的网站百度安装应用
  • 论坛网站模板源码下载现在有哪些推广平台
  • 中国人民银行网站打不开google免费入口
  • 提升网站的访问速度昆明网络推广
  • 上海建设工程检测网站产品市场营销策划方案
  • 曲周企业做网站推广新手怎么做seo优化
  • 佛山专业网站制作公司而的跟地seo排名点击软件
  • 网站备案是什么一回事网站快速优化排名推荐
  • 湖北响应式网站建设企业官方推广平台
  • 怎么做电商网站seo与sem的区别与联系
  • 一些做义工的旅游网站新品牌推广策略
  • 网站没有索引量是什么意思培训机构哪家好
  • 企业所得税优惠税率东莞seo外包公司