Loss luôn trả về infinity

nlp
tensorflow
machine-learning

#1

Xin chào mọi người. Em đang dùng keras (backend tensorflow) để xây dựng một Question answering model ạ. Sau đây là một số thông số:

  • N: số lượng samples ta có để train
  • Input cho model: có 2 Inputs, Context và Query, shape lần lượt là (số_từ_context, 200) và (số_từ_query, 200).
  • Output của model: gồm 2 vector p1, p2 cùng shape (có softmax).
  • Loss function: em tự define hàm loss, hàm này có y_pred là p1 và p2, còn y_true là mảng gồm 2 số nguyên dương dùng làm index cho p1 và p2. loss = - (log(p1[ y_true[0] ]) + log(p2[ y_true[1] ]))

Gọi hàm model.fit() với parameters là các training samples Context và Query, shape là (N, số_từ_context, 200) và (N, số_từ_query, 200).

  • Vấn đề: loss luôn trả về infinity.

Để degub, em dùng tf.Print và in p1, p2, y_true, thì nhận thấy trong hàm loss này có đến N vector p1, N vector p2, và với mỗi loại p1, p2 thì chỉ có 1 vector chứa các giá trị là probability, còn lại mọi thứ đều là 0.00. Em nghĩ đây chính là lí do loss trả về infinity (- log(0) = infiniy).

Theo hiểu biết của em, đáng lẽ trong hàm loss, chỉ có 1 training sample được pass vào, nghĩa là chỉ có 1 vector p1, 1 vector p2 và 1 mảng y_true, và hàm loss này sẽ được gọi N lần trên N training samples. Nên em đang nghĩ ra 1 solution là ép cho forward pass phải được thực hiện trên N training samples trước (hoặc chí ít là trên 1 số lượng nhỏ training samples), rồi sau đó mới áp dụng loss function cho số samples đã qua forward pass đó. Nhưng em vẫn chưa tìm ra cách, hoặc nếu em hiểu sai thì em cũng không biết có cách nào khác để giải quyết nữa ạ.

Mong nhận được giúp đỡ từ mọi người ạ.


[03/06/2020 13:33] Nhờ các bạn trả lời giúp: [https://forum.machinelearningcoban.com/t/loss-luon-tra-ve-infinity/7338](https://forum.machinelearningcoban.com/t/loss-luon-tra-ve-infinity/7338) . . .
#2

Bạn paste code lên mọi người sẽ dễ tìm bug hơn là mô tả không thế này.


#3

Cho mình thắc mắc về Output của bạn tý. Đưa ra 2 vector p1 và p2 đại diện cho cái j nhỉ? Bạn có thể trình bày hoặc show code lên để mng xem kĩ hơn hoặc ít nhất là model.summary() để mọi người hiểu mô hình như thế nào :smiley: vì softmax thì hiếm khi mình thấy ra 0 hết mà ít nhất phải có 1 giá trị khác 0 dù rất nhỏ.


#5

Cảm ơn mọi người. Em đã tìm ra được vấn đề rồi ạ, do các inputs cho các layers mà em đã define bị bỏ qua batch size ạ, do em set hết cho tụi nó về 1 thay vì là unknown. Em đã sửa hết lại, loss đã trở thành các số thập phân rồi ạ, nhưng giờ em bị lỗi giống như thế này https://github.com/tensorflow/tensorflow/issues/28007 ạ, và có vẻ như là chưa có fix được lỗi này :frowning:


#6

Mình nghĩ bạn nên chụp hẳn code và phần lỗi lên thì sẽ dễ dàng hơn cho mng khi giúp. Như theo vấn đề bạn nói thì ở link bạn gửi ngta cũng đề cập đến vde conflict giữa CPU vs GPU khi summary model. Vấn đề này hình như chưa fix đc thật.


#7

Bạn không cho code lên đây để mọi người xem thì khó debug lắm.