YeeKal

note11_auto_differentiable

YeeKal
"#"

differential

numerical derivative:

partial derivative:

The vector of partial derivatives of a scalar-value multivariate function:

In general:

Suppose that $\boldsymbol{x} \in \mathbb{R}^{m}, \boldsymbol{y} \in \mathbb{R}^{n}, g$ maps from $\mathbb{R}^{m}$ to $\mathbb{R}^{n}$ and $f$ maps from $\mathbb{R}^{n}$ to $\mathbb{R}$ If $\boldsymbol{y}=g(\boldsymbol{x})$ and $z=f(\boldsymbol{y})$, then Equivalently, in vector notation: where $\frac{\partial \boldsymbol{y}}{\partial \mathbf{x}}$ is the $n \times m$ Jacobian matrix of $g$.

gradient-descent solution to SVD

SVD decomposition problem reduced ta finding $\min {\hat{\boldsymbol{U}}, \hat{\boldsymbol{V}}}\left(\left|\boldsymbol{A}-\hat{\boldsymbol{U}} \hat{\boldsymbol{V}}^{\top}\right|\right)$:}}^{2

其中, 梯度公式:

更新公式:

# gradient based svd
import numpy as np

A = np.random.randn(10,5)

U, S, V = np.linalg.svd(A, full_matrices=False)

K=5
Up = np.random.randn(10,K)
Vp = np.random.randn(5,K)
alpha=0.1

for epoch in range(1000):
    for r in range(A.shape[0]):
        for c in range(A.shape[1]):
            e = A[r][c] - Up[r]@Vp[c]
            for k in range(K):
                urk = Up[r][k] + alpha*e*Vp[c][k]
                vck = Vp[c][k] + alpha*e*Up[r][k]
                Up[r][k] = urk
                Vp[c][k] = vck
    if epoch%100 == 0:
        print('epoch:', epoch, 'error:', ((A - Up@Vp.transpose())**2).sum())

print('Final error:', ((A - Up@Vp.transpose())**2).sum())

print("A:\n", A)
print("A':\n", Up@Vp.transpose())

un = np.sqrt((Up**2).sum(0))
vn = np.sqrt((Vp**2).sum(0))
Up = Up / un
Vp = Vp / vn

print("un, vn:",un, vn)
Sp = un*vn

print("S:\n", S)
print(np.sort(Sp)[::-1])

print("U:\n", U)
print("Up:\n", Up)

reverse AD

back propogation

ref

-project - 200行写一个自动微分工具 - blog - 自动微分简介:前向模式、反向模式及python代码实现 - 数值微分的简单代码实现 - reverse-mode-automatic-differentiation