Hỏi han về triplet loss ?

machine-learning

#1

Chào mọi người em cũng vừa tìm hiểu về triplet loss trong việc train với LFW dataset

Em có thắc mắc là sau khi train xong em sử dụng thì cũng ổn nhưng khi chạy cùng 1 tấm hình với 1 tấm hình so khớp thì nó lại ra 0 . Nhưng trong một bài viết nó lại ghi là giá trị ra càng lớn càng tốt ??

Vậy tại sao lại là 0 ???

Cảm ơn mọi người đã đọc mong mọi người giúp em hiểu rõ về triplet loss cũng như là giá trị max và min của nó là gì ?


#2

Mình nghĩ triplet loss nó sẽ đưa ảnh gốc về 1 vector A.

Cái ảnh bạn cần so sánh sẽ đưa về 1 vector B.

Kết quả trả về sẽ là khoảng cách giữa 2 vector A và B. Vì vậy nếu 2 ảnh giống nhau thì khoảng cách này nhỏ, còn 2 ảnh khác nhau thì khoảng cách này lớn.

Và trường hợp của bạn, hai ảnh so khớp thì khoảng cách của nó là 0. Hy vọng giúp được bạn


#3

Minh không chắc nữa bạn do mình train ra thì nếu càng lớn thì mới càng chính xác thì theo lời ở đây thấy đúng lắm

Nhưng khi mình Predict A (ra 128 điểm) trên Hình A và mình Predict B (ra 128 điểm) trên Hình A (Mình ví dụ trên cùng 1 ảnh cùng 1 người để xem giá trị nó thế nào) rồi mình trừ 2 vector ra bằng

`np.linalg.norm(2 vector`

thì mình thấy nó lại ra 0 ???

Nên mình thắc mắc lắm ko biết sao lại thế ?


#4

Nếu bạn đưa vào 2 bức ảnh giống nhau mà ra bằng 0 thì mình nghĩ công thức bạn đưa và code của bạn có sai khác.

Đáp án trên phải cho ra

g

Giải thích: D() là hàm tính khoảng cách của 2 bức ảnh. Vì vậy D(f( p ), f(p+)) = 0, D(f( p ), f(p-)) = 0.

Vì vậy, l(p,p+,p-) = max(0,g + 0 - 0) = g

Còn nếu bạn tính đơn thuần khoảng cách của 2 vectors từ 2 bức ảnh giống nhau thì giá trị xuất ra sẽ là bằng 0.


#5

Cảm ơn bạn đã quan tâm đến câu hỏi của mình mình có thể chắc là thuật toán mình không sai do aa

Bạn có thể xem giúp mình được không mình thấy đúng mà nhỉ ???


#6

@Phan_Huu_Tho

với mình nghĩ nếu 2 ảnh giống nhau thì sao khổng cách nữa nó với thằng positive và negative bằng 0 được bạn nhỉ ??? D(f( p ), f(p+)) = 0, D(f( p ), f(p-)) = 0. (bạn có thể giải thích lúc này giúp mình dc chứ ? do mình train model ra rồi xai mà nhỉ ???)


#7

Phần code thì chắc mình không giúp bạn được. Mình sẽ hỗ trợ giúp bạn giải thích cái hàm mà bạn viết ở trên nhé. Hy vọng nó có ích cho bạn trong việc debug.

l(p, p+, p-) = max{0, g + D(f( p), f(p+)) - D(f( p), f(p+))}

Ở đây, chúng ta giả sử có 3 ảnh là: P (ảnh gốc), P+ (ảnh gần giống ảnh gốc P), P- (ảnh khác ảnh gốc P)

Giả sử, ở các bước trước, sử dụng CNN hay gì đó, chúng ta đã biến đổi lần lược 3 bức ảnh P, P+, P- thành 3 vector tương ứng là p, p+, p-

Và bây giờ công thức của chúng ta có:

l là hàm mất mát triplet loss, chúng ta cần minimize cái hàm này.

Blockquote D là hàm tính khoảng cách giữa 2 vector. Chúng ta hy vọng số D(p,p+) sẽ nhỏ vì hình P và P+ gần giống nhau, còn số D(p,p-) sẽ lớn vì 2 hình đó khác nhau

g là một số, gọi là margin, chúng ta muốn khoảng cách giữa D(p,p+) và D(p,p-) phải tối thiểu là lớn hơn margin g.

Lúc này khi chúng ta nhìn vào công thức ở phần

D(f( p), f(p+)) - D(f( p), f(p+)) Tức là nó đang muốn “kéo” cái 2 cái hình giống nhau lại và “đẩy” hai cái hình khác nhau ra xa.

Giờ quay trở về câu hỏi của bạn.

Khi mình train mô hình xong rồi, mình có model, thì mình cần đi tạo bộ database bao gồm các vector mà mình muốn sẽ được mang ra so sánh. Ví dụ như hình A, sau khi qua model sẽ ra được vector a (128 điểm). Giờ mình muốn so sánh hình A với hình B, thì cũng đưa hình B qua model sẽ được vector b (128 điểm).

Vì trong trường hợp của bạn là hình A và hình B giống nhau nên khoảng cách giữa vector a và b khi qua cùng một model sẽ là 0. Đó là lý do tại sao chúng ta có kết quả là 0.

Hy vọng nó giúp được bạn