深度学习 - 2019年1月27日

反向传播

想法

放假在家也要坚持锻炼呀!

笔记

在前向传播(forward)时,需要保存中间结果用来计算本地梯度(local gradient)。

Jacobian matrix 是对角阵。

PyTorch的Sigmoid代码节选:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <>
__global__ void
SigmoidCUDAKernel<float>(const int N, const float* X, float* Y) {
CUDA_1D_KERNEL_LOOP(i, N) {
#if __CUDA_ARCH__ >= 350
Y[i] = 1.0f / (1.0f + expf(-__ldg(X + i)));
#else
Y[i] = 1.0f / (1.0f + expf(-X[i]));
#endif
}
}

template <typename T>
__global__ void
SigmoidGradientCUDAKernel(const int N, const T* dY, const T* Y, T* dX) {
CUDA_1D_KERNEL_LOOP(i, N) {
#if __CUDA_ARCH__ >= 350
dX[i] = __ldg(dY + i) * __ldg(Y + i) * (T(1) - __ldg(Y + i));
#else
dX[i] = dY[i] * Y[i] * (T(1) - Y[i]);
#endif
}
}

事情慢慢变得变态了起来……