เป็นวิธีปฏิบัติทั่วไปหรือไม่ที่จะลดความสูญเสียเฉลี่ยให้น้อยที่สุดแทนที่จะเป็นผลรวม?


17

Tensorflow มีตัวอย่างที่สอนเกี่ยวกับการจำแนกCIFAR-10 ในบทช่วยสอนการลดการสูญเสียเอนโทรปีโดยเฉลี่ยในชุดการสอนจะลดลง

def loss(logits, labels):
  """Add L2Loss to all the trainable variables.
  Add summary for for "Loss" and "Loss/avg".
  Args:
    logits: Logits from inference().
    labels: Labels from distorted_inputs or inputs(). 1-D tensor
            of shape [batch_size]
  Returns:
    Loss tensor of type float.
  """
  # Calculate the average cross entropy loss across the batch.
  labels = tf.cast(labels, tf.int64)
  cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
      logits, labels, name='cross_entropy_per_example')
  cross_entropy_mean = tf.reduce_mean(cross_entropy, name='cross_entropy')
  tf.add_to_collection('losses', cross_entropy_mean)

  # The total loss is defined as the cross entropy loss plus all of the weight
  # decay terms (L2 loss).
  return tf.add_n(tf.get_collection('losses'), name='total_loss')

ดูcifar10.pyบรรทัด 267

เหตุใดจึงไม่ลดผลรวมให้น้อยที่สุดในชุดงานแทน มันสร้างความแตกต่างหรือไม่? ฉันไม่เข้าใจว่าสิ่งนี้จะส่งผลกระทบต่อการคำนวณ backprop อย่างไร


ไม่มีความเกี่ยวข้องทั้งหมด / เฉลี่ย แต่ตัวเลือกการสูญเสียเป็นตัวเลือกการออกแบบแอปพลิเคชัน ตัวอย่างเช่นหากคุณพอใจกับการเป็นคนที่ดีเฉลี่ยให้เพิ่มประสิทธิภาพโดยเฉลี่ย หากแอปพลิเคชันของคุณมีความไวต่อสถานการณ์กรณีที่เลวร้ายที่สุด (เช่นความผิดพลาดของยานยนต์) คุณควรปรับค่าสูงสุดให้เหมาะสม
Alex Kreimer

คำตอบ:


17

ตามที่กล่าวไว้โดย pkubik มักจะมีคำว่า normalization สำหรับพารามิเตอร์ที่ไม่ได้ขึ้นอยู่กับอินพุตตัวอย่างเช่นใน tenorflow

# Loss function using L2 Regularization
regularizer = tf.nn.l2_loss(weights)
loss = tf.reduce_mean(loss + beta * regularizer)

ในกรณีนี้การหาค่าเฉลี่ยของ mini-batch ช่วยรักษาอัตราส่วนคงที่ระหว่างการcross_entropyสูญเสียและการregularizerสูญเสียในขณะที่ขนาดแบทช์เปลี่ยนไป

ยิ่งไปกว่านั้นอัตราการเรียนรู้ก็มีความอ่อนไหวต่อขนาดของการสูญเสีย (การไล่ระดับสี) ดังนั้นเพื่อที่จะทำให้ผลของขนาดแบทช์ที่เป็นมาตรฐานกลับสู่ปกติ


ปรับปรุง

บทความนี้โดย Facebook (ถูกต้องขนาดเล็กมาก SGD: การฝึกอบรม ImageNet ใน 1 ชั่วโมง) แสดงให้เห็นว่าจริง ๆ แล้วปรับอัตราการเรียนรู้ตามขนาดของชุดงานทำได้ค่อนข้างดี:

กฎการปรับสเกลเชิงเส้น: เมื่อขนาดมินิบัสถูกคูณด้วย k ให้คูณอัตราการเรียนรู้ด้วย k

ซึ่งก็เหมือนกับการไล่ระดับสีคูณด้วย k และทำให้อัตราการเรียนรู้ไม่เปลี่ยนแปลงดังนั้นฉันเดาว่าไม่จำเป็นต้องใช้ค่าเฉลี่ย


8

ฉันจะมุ่งเน้นในส่วน:

ฉันไม่เข้าใจว่าสิ่งนี้จะส่งผลกระทบต่อการคำนวณ backprop อย่างไร

ก่อนอื่นคุณอาจสังเกตเห็นแล้วว่าความแตกต่างเพียงอย่างเดียวระหว่างค่าการสูญเสียที่เกิดขึ้นคือการสูญเสียเฉลี่ยจะลดลงตามสัดส่วนของนั่นคือโดยที่คือขนาดแบทช์ เราสามารถพิสูจน์ได้ว่าความสัมพันธ์แบบเดียวกันนั้นเป็นจริงสำหรับอนุพันธ์ของตัวแปรใด ๆ ฟังก์ชั่นการสูญเสีย ( ) โดยดูคำจำกัดความของอนุพันธ์: ตอนนี้เราต้องการคูณมูลค่าของฟังก์ชันและดูว่ามันมีผลต่ออนุพันธ์อย่างไร: 1BLSยูM=BLAVGBdLSยูMdx=BdLAVGdx

dLdx=LimΔ0L(x+Δ)-L(x)Δ
d(L)dx=LimΔ0L(x+Δ)-L(x)Δ
เมื่อเราแยกค่าคงที่ออกมาและย้ายไปก่อนที่ขีด จำกัด เราจะเห็นว่าเราเกิดขึ้นกับนิยามอนุพันธ์ดั้งเดิมคูณด้วยค่าคงที่ซึ่ง เป็นสิ่งที่เราต้องการพิสูจน์:
d(L)dx=LimΔ0L(x+Δ)-L(x)Δ=dLdx

ในสิงคโปร์เราจะอัปเดตตุ้มน้ำหนักโดยใช้การไล่ระดับสีคูณด้วยอัตราการเรียนรู้และเราสามารถเห็นได้อย่างชัดเจนว่าเราสามารถเลือกพารามิเตอร์นี้ในวิธีที่การอัปเดตตุ้มน้ำหนักสุดท้ายจะเท่ากัน กฎการอัพเดทครั้งแรก: และกฎการอัปเดตที่สอง (ลองจินตนาการว่า ): λ

W=W+λ1dLSยูMdW
λ1=λ2B
W=W+λ1dLAVGdW=W+λ2BdLSยูMdW


การค้นพบที่ยอดเยี่ยมโดยdontlooอาจแนะนำว่าการใช้ผลรวมอาจเป็นวิธีที่เหมาะสมกว่าเล็กน้อย เพื่อหาค่าเฉลี่ยซึ่งดูเหมือนจะเป็นที่นิยมมากกว่าฉันเพิ่มว่าการใช้ผลรวมอาจทำให้เกิดปัญหากับน้ำหนักปกติ การปรับอัตราส่วนการปรับสำหรับ regularizers สำหรับขนาดชุดที่แตกต่างกันอาจจะน่ารำคาญเท่ากับการปรับอัตราการเรียนรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.