【问题标题】:python - explanation of lambda where a parameter is not used in its expressionpython - 解释在其表达式中未使用参数的 lambda
【发布时间】: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 的导数。

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


    【解决方案1】:

    一般来说,您可以编写一个完全不使用其参数的 lambda 函数。例如:

    
    >>> a = lambda x,y:1+2
    >>> a(1,2)
    3
    >>> a(None,4)
    3
    >>> a()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: <lambda>() missing 2 required positional arguments: 'x' and 'y'
    
    
    

    在您的问题中,您问过“为什么 loss(x, t) 只能接受一个参数?”。因为 lambda 函数只接受一个参数,甚至不使用它,而是将其他参数提供给 loss 方法。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2018-09-11
      • 2016-12-31
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多