【发布时间】:2021-02-10 11:11:02
【问题描述】:
问题
请帮助理解这个 lambda 定义是什么,参数 w 没有出现在表达式部分。
loss_w = lambda w: loss(x, t) # <---- parameter w is not used in the expression
gradient(loss_w, W)
loss_w 被称为f(arg),只有一个参数,而loss 有两个参数。
def gradient(f, arg):
...
fh2: float = f(arg) # <--- how come 'loss' can take one argument as f(W)?
在我的理解中,参数是在表达式中使用的,例如lambda w: w**2.
lambda_expr ::= "lambda" [parameter_list] ":" expression
lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond
Lambda expressions (sometimes called lambda forms) are used to create anonymous functions.
The expression lambda parameters: expression yields a function object. The unnamed object
behaves like a function object defined with:
def <lambda>(parameters):
return expression
代码
代码正在计算 loss 函数 f 的导数。
- cs231Gradient Checks
import numpy as np
W = 0.01 * np.random.randn(2, 3)
def relu(x):
return np.maximum(0, x)
def loss(x, t): # <---------- 'loss' function
global W
a = relu(np.matmul(X, W.T))
a:float = a - np.max(a, axis=-1, keepdims=True)
p:float = np.exp(a) / np.sum(np.exp(a), axis=-1, keepdims=True)
batch_size = p.shape[0]
return -np.sum(np.log(p[np.arange(batch_size), t] + 1e-7)) / batch_size
def gradient(f, arg): # <---------- 'loss' function is passed as f
h:float = 1e-4 # 0.0001
grad = np.zeros_like(arg, dtype=float)
it = np.nditer(arg, flags=['multi_index'], op_flags=['readwrite'])
while not it.finished:
idx = it.multi_index
tmp_val = arg[idx]
# f(x+h)
arg[idx] = tmp_val + h
fh1: float = f(arg) # <--- why loss(x, t) can only take one argument?
# f(x-h)
arg[idx] = tmp_val - h
fh2: float = f(arg)
grad[idx] = (fh1 - fh2) / (2*h)
arg[idx] = tmp_val
it.iternext()
return grad
def numerical_gradient(x, t):
t = t.reshape(1, t.size) if t.ndim == 1 else t
x = x.reshape(1, y.size) if x.ndim == 1 else x
loss_w = lambda w: loss(x, t) # <----- What is this w?
global W
return gradient(loss_w, W)
原代码是two_layer_net.py,它实现了cs231。
更新
现在我确信W 是一个冗余参数。 f(x) 的原始意图是明确的,因此尝试将权重参数 W 传递为 f(W)。也许应该是lambda w: loss(w, t)。
【问题讨论】:
标签: python lambda backpropagation