当前位置: 网站首页>小程序开发>网站优化

丹阳网站制作要多少钱【域名企业邮箱服务器注册申请办理】丹阳网络优化公司哪家好、丹阳软件开发外包价格、丹阳高端企业网站页面制作设计专业公司、丹阳微信公众号小程序购物支付搭建制作公司

发表日期: 2021-04-27 12:56:49 浏览次数:106

丹阳网站制作要多少钱【域名企业邮箱服务器注册申请办理】丹阳网络优化公司哪家好、丹阳软件开发外包价格、丹阳高端企业网站页面制作设计专业公司、丹阳微信公众号小程序购物支付搭建制作公司


丹阳市,江苏省辖县级市,由镇江市代管,位于江苏省南部,介于北纬31°44′~32°08′、东经119°23′~119°53′之间,总面积1047平方公里。丹阳属亚热带季风气候,具有气候湿润、光照充足、雨量丰沛、无霜期长、四季分明的气候特征。截至2019年,丹阳市辖2个街道、10个镇。常住人口80.63 万人。 [1] 

丹阳建置始于战国时期,初为云阳邑。《山海经》中有一条河叫“丹水”,即丹江,根据“山水阴阳,水北为阳”的理论命名丹阳。 [2]  1987年12月,丹阳撤县设市,为丹阳市,由镇江市代管。丹阳市与常州市新北区交界处建有常州奔牛国际机场,沪宁高速公路(G42沪蓉高速)、312国道、122省道、338省道等是通过公路出入丹阳的主要干道,水运有京杭大运河纵贯丹阳,大港港口是对外开放的长江第三大港。 [3] 

2019年,丹阳市实现地区生产总值1121.99亿元,同比增长4.7%。 [4]  2018年12月,入选全国县域经济综合竞争力100强,2018中国大陆最佳商业城市100强、中国最佳县级城市30强。 [5]  2019年10月8日,被评为2019年度全国综合实力百强县市。 [6]  2019全国营商环境百强县。 [7]  2019年国家卫生城市。 [8]  2020年12月,社科院发布《全国县域经济综合竞争力100强》,丹阳排名第40 [9]  。

这里只是像以前一样向前发送输入。有一点需要明确:即使在这个更复杂的场景中,也应该能够使用链式法则计算所需的梯度。

代码

对于输入为两个二维数组的运算,可以像下面这样编码。

def matrix_function_forward_sum(X: ndarray,
                                W: ndarray,
                                sigma: Array_Function) -> float:
    '''
    输入ndarray(X、W)以及函数sigma,计算该函数的前向传递结果。
    '''
    assert X.shape[1] == W.shape[0]

    # 矩阵乘法
    N = np.dot(X, W)

    # 通过sigma传递矩阵乘法的输出
    S = sigma(N)

    # 将所有元素相加
    L = np.sum(S)

    return L复制代码

1.13 有趣的部分:后向传递

现在,要对函数“执行后向传递”,这样一来,即使涉及矩阵乘法,也可以最终计算出 N 相对于输入 ndarray 的每个元素的梯度 5。在学完本章之后,就能轻松地在第 2 章中开始训练真正的机器学习模型。下面先从概念上明确要学习的内容。

5接下来重点计算 N 相对于 X 的梯度,但 W 的梯度可以通过类似的方法来计算。

数学

注意,可以直接计算。值 L 实际上是从 x_{11}  、x_{12}  直到 x_{33}  的一个函数。

但是,这似乎很复杂。链式法则的全部要点就是将复杂函数的导数分解成简单的部分,对每个部分执行计算,然后把结果相乘。如此一来,对这些操作进行编码就变得很容易:只需要逐步进行前向传递,保存传递过程中的结果,然后使用这些结果来计算后向传递所需的所有导数。

下面展示这种方法仅适用于涉及矩阵的情况。开始深入讨论吧。

可以将 L 写成 \Lambda(\sigma(v(\boldsymbol{X},\boldsymbol{W})))。如果这是一个常规函数,就可以这样编写链式法则:

\dfrac{\partial\Lambda}{\partial\boldsymbol{X}}(\boldsymbol{X})=\dfrac{\partial v}{\partial\boldsymbol{X}}(\boldsymbol{X},\boldsymbol{W})\times\dfrac{\partial\sigma}{\partial u}(N)\times\dfrac{\partial\Lambda}{\partial u}(S)

然后依次计算 3 个偏导数。前面在计算包含 3 个嵌套函数的复合函数的导数时,我们使用链式法则分别对每个函数进行了求导,这里要执行同样的操作。图 1-22(参见下一页)表明,该方法同样适用于这种函数。

由于一阶导数最直接,因此这里从一阶导数开始计算,主要是确定当 S 中每个元素值增加时,Λ 的输出 L 的增长情况。由于 L 是 S 中所有元素的总和,因此这个导数很简单:

\dfrac{\partial\Lambda}{\partial u}(S)=\begin{bmatrix}1&1\\1&1\\1&1\end{bmatrix}

只要 S 中的任何元素有所增加,比如增加 0.46 个单位,\Lambda  就会增加 0.46 单位。

接下来得到 \dfrac{\partial\sigma}{\partial u}(N)。这只是对 N 中元素进行求值的任一函数 \sigma 的导数。在前面使用的 XW 语法中,这同样很容易计算:

\begin{bmatrix}\dfrac{\partial\sigma}{\partial u}(XW_{11})&\dfrac{\partial\sigma}{\partial u}(XW_{12})\\\dfrac{\partial\sigma}{\partial u}(XW_{21})&\dfrac{\partial\sigma}{\partial u}(XW_{22})\\\dfrac{\partial\sigma}{\partial u}(XW_{31})&\dfrac{\partial\sigma}{\partial u}(XW_{32})\end{bmatrix}

注意,我们现在可以肯定地说,能够将这两个导数按元素逐个相乘并计算 \dfrac{\partial\Lambda}{\partial u}(N)

\dfrac{\partial\Lambda}{\partial u}(N)=\dfrac{\partial\Lambda}{\partial u}(S)\times\dfrac{\partial\sigma}{\partial u}(N)=\begin{bmatrix}\dfrac{\partial\sigma}{\partial u}(XW_{11})&\dfrac{\partial\sigma}{\partial u}(XW_{12})\\\dfrac{\partial\sigma}{\partial u}(XW_{21})&\dfrac{\partial\sigma}{\partial u}(XW_{22})\\\dfrac{\partial\sigma}{\partial u}(XW_{31})&\dfrac{\partial\sigma}{\partial u}(XW_{32})\end{bmatrix}\times\begin{bmatrix}1&1\\1&1\\1&1\end{bmatrix}=\begin{bmatrix}\dfrac{\partial\sigma}{\partial u}(XW_{11})&\dfrac{\partial\sigma}{\partial u}(XW_{12})\\\dfrac{\partial\sigma}{\partial u}(XW_{21})&\dfrac{\partial\sigma}{\partial u}(XW_{22})\\\dfrac{\partial\sigma}{\partial u}(XW_{31})&\dfrac{\partial\sigma}{\partial u}(XW_{32})\end{bmatrix}

然而,现在陷入了困境。基于图 1-22 并应用链式法则,接下来要做的是获取 \dfrac{\partial v}{\partial u}(\boldsymbol{X})。但是,回想一下,v 的输出 N 只是 \boldsymbol{X} 与 \boldsymbol{W} 矩阵相乘的结果。因此,这里要知道 N(3×2 矩阵)中每个元素随着 \boldsymbol{X} 中每个元素(3×3 矩阵)的增加而增加的量。如果上面的表述难以理解,只要明确一点就可以了,那就是现在根本不清楚如何定义它,或者无法确定这样做真的有效。

为什么会出现这个问题呢?以前,我们很幸运,由于 \boldsymbol{X} 和 \boldsymbol{W} 在形状上可以相互转换,因此可以证明 \dfrac{\partial v}{\partial u}(\boldsymbol{X})=\boldsymbol{W}^{\rm T} 和 \dfrac{\partial v}{\partial u}(\boldsymbol{W})=\boldsymbol{X}^{\rm T}。现在可以得出类似的结论吗?

“?”的值

更具体地说,现在需要弄清楚以下公式中的“?”到底是什么。

\dfrac{\partial\Lambda}{\partial u}(\boldsymbol{X})=\dfrac{\partial\Lambda}{\partial u}(\sigma(N))\times?=\begin{bmatrix}\dfrac{\partial\sigma}{\partial u}(XW_{11})&\dfrac{\partial\sigma}{\partial u}(XW_{12})\\\dfrac{\partial\sigma}{\partial u}(XW_{21})&\dfrac{\partial\sigma}{\partial u}(XW_{22})\\\dfrac{\partial\sigma}{\partial u}(XW_{31})&\dfrac{\partial\sigma}{\partial u}(XW_{32})\end{bmatrix}\times?

答案

事实证明,根据乘法的计算方式,“?”处的内容就是 \boldsymbol{W}^{\rm T},这和刚才看到的向量点积的简单示例是一样的。有一种方法可以验证这一点,那就是直接针对 \boldsymbol{X} 中的每个元素计算 L 的偏导数。这样一来 6,得到的矩阵确实显著地分解成:

6更多介绍参见附录的“矩阵链式法则”。

\dfrac{\partial\Lambda}{\partial u}(\boldsymbol{X})=\dfrac{\partial\Lambda}{\partial u}(S)\times\dfrac{\partial\sigma}{\partial u}(N)\times\boldsymbol{W}^{\rm T}

其中第一个乘法是逐个元素执行的,第二个则是矩阵乘法。

这意味着,即使计算图中的运算涉及将矩阵与多行和多列相乘,并且即使这些运算的输出形状与输入的形状不同,仍然可以将这些运算包含在计算图中,并且使用“链式法则”逻辑对它们进行反向传播。这个结果非常重要,如果没有这个结果,那么训练深度学习模型将变得更加烦琐,后文会进一步介绍这一点。

示意图

本例的示意图与 1.12 节中的类似,如图 1-22 所示。

图 1-22:复杂函数中的后向传递

只需要计算每个组成函数的偏导数,在其输入处进行求值,并将结果相乘,就可以得到最终的导数。要依次计算这些偏导数,唯一的方法就是从上述数学层面计算。

代码

现在通过代码封装前面推导出的内容,此过程有助于加深对内容的理解:

def matrix_function_backward_sum_1(X: ndarray,
                                   W: ndarray,
                                   sigma: Array_Function) -> ndarray:
    '''
    计算矩阵函数相对于第一个矩阵输入的和的导数。
    '''
    assert X.shape[1] == W.shape[0]

    # 矩阵乘法
    N = np.dot(X, W)

    # 通过sigma传递矩阵乘法的输出
    S = sigma(N)

    # 将所有元素相加
    L = np.sum(S)

    # 注意,这里按数量指代导数,这点与数学不同,在数学中使用的是它们的函数名

    # dLdS——都是1
    dLdS = np.ones_like(S)

    # dSdN
    dSdN = deriv(sigma, N)

    # dLdN
    dLdN = dLdS * dSdN    # dNdX
    dNdX = np.transpose(W, (1, 0))

    # dLdX
    dLdX = np.dot(dSdN, dNdX)

    return dLdX复制代码

现在,确认一切正常:

np.random.seed(190204)X = np.random.randn(3, 3)W = np.random.randn(3, 2)print("X:")print(X)print("L:")print(round(matrix_function_forward_sum(X, W, sigmoid), 4))print()print("dLdX:")print(matrix_function_backward_sum_1(X, W , sigmoid))X:[[-1.5775 -0.6664  0.6391]
 [-0.5615  0.7373 -1.4231]
 [-1.4435 -0.3913  0.1539]]L:2.3755dLdX:[[ 0.2489 -0.3748  0.0112]
 [ 0.126  -0.2781 -0.1395]
 [ 0.2299 -0.3662 -0.0225]]复制代码

和前面的示例一样,由于 dLdX 表示 \boldsymbol{X} 相对于 L 的梯度,因此这意味着,左上角的元素表示 \dfrac{\partial\Lambda}{\partial x_{11}}=(\boldsymbol{X},\boldsymbol{W})=0.2489

丹阳网站制作要多少钱域名企业邮箱服务器注册申请办理丹阳网络优化公司哪家好、丹阳软件开发外包价格、丹阳高端企业网站页面制作设计专业公司、丹阳微信公众号小程序购物支付搭建制作公司

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: http://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878