Skip to content

Commit

Permalink
add figures & code in lecture
Browse files Browse the repository at this point in the history
  • Loading branch information
yqyq-w committed May 30, 2024
1 parent 718f7bb commit 140dcf0
Show file tree
Hide file tree
Showing 3 changed files with 292 additions and 12 deletions.
6 changes: 4 additions & 2 deletions course12/course_en.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
marp: false
marp: true
math: mathjax
paginate: true
backgroundImage: url('../pics/background_moonbit.png')
Expand Down Expand Up @@ -65,8 +65,10 @@ headingDivider: 1
# Differentiation
- Ways to differentiate a function:
- Manual differentiation: purely natural calculator
- Drawback: easy to make mistakes with complex expressions
- Numerical differentiation: $\frac{ \texttt{f}(x + \delta x) - \texttt{f}(x) }{ \delta x }$
- Drawback: computers cannot accurately represent decimals, and the larger the absolute value, the less accurate it is
- Symbolic differentiation: `Mul(Const(2), Var(1)) -> Const(2)`
- Drawback: calculations can be complex; possible redundant calculations; hard to directly use native control flow
Expand Down Expand Up @@ -189,7 +191,7 @@ headingDivider: 1
(a, Constant(_) as const) => const * a
_ => Mul(f1, f2)
} }
```
```
- Simplification result
```moonbit
let diff_0_simplified : Symbol = Mul(Constant(5.0), Var(0))
Expand Down
2 changes: 1 addition & 1 deletion course12/lec12_script.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

之后,我们定义相加与相乘,根据求导法则直接计算微分。例如,两个函数f与g相加所获得的函数,值就是函数的值相加,微分也是函数的微分相加,如第4行所示。而两个函数f与g相乘所获得的函数,值就是函数的值相乘,而微分则如之前所介绍,f * g' + g * f'。这样我们就在没有构造任何中间数据结构的情况下直接计算了微分。

最后,我们利用刚才定义的带有条件表达式的例子计算微分。需要注意的是,前向微分每次只能对一个输入的参数计算微分,因此适用于输入参数多于输出参数的情况。而在神经网络中,我们则通常是有大量的参数,和一个输出。因此就要用到接下来介绍的后向微分。
最后,我们利用刚才定义的带有条件表达式的例子计算微分。需要注意的是,前向微分每次只能对一个输入的参数计算微分,因此适用于输出参数多于输入参数的情况。而在神经网络中,我们则通常是有大量的参数,和一个输出。因此就要用到接下来介绍的后向微分。

后向微分是利用链式法则进行计算的。假设我们有一个函数w,是关于x y z等的,而x y z等又是关于t的函数,那么w关于t的偏微分就是w关于x的偏微分乘以x关于t的偏微分加上w关于y的偏微分乘以y关于t的偏微分,加上w关于z的偏微分乘以z关于t的偏微分,等等。例如下面的f(x0, x1) = x0平方乘以x1。我们可以看作是f关于g和h的函数,而g和h由分别是x0平方和x1。我们对每一个组成进行偏微分:f关于g的偏微分是h,关于h的偏微分是g,g关于x0的偏微分是2x0,h关于x0的偏微分是0。最后,我们利用链式法则进行组合,获得结果2x0x1。后向微分便是这样的过程,我们从最后的f关于f的偏微分开始,向后计算f关于中间函数的偏微分,以及中间函数关于中间函数的偏微分,直到中间函数关于输出参数的偏微分为止。这样做,我们逆着构造f的计算图,可以计算出每个输入节点的微分。这适用于输入参数多于输出参数的情况。

Expand Down
Loading

0 comments on commit 140dcf0

Please sign in to comment.