pytorch에는 rnnt-loss 함수가 공식적으로 제공된다.
tensorflow에는 rnnt-loss 함수가 제공되지 않는다.
3rd party 모듈이 있었지만 입력을 어떻게 줘야하는 지에 대한 세부 설명이 없어서
자작해 봤다.
custom tensorflow 함수를 만드는 아주 좋은 경험들을 얻게 된거 같다.
이 자작함수 만드려면 생각지도 못한 수치 오류와 아이디어들로 넘쳐난다.
custom 함수를 만들면서 고려해야 하는 것은 크게 3가지다.
- gpu 연산을 사용하도록 설계해야 한다.
- 수치 연산 도중에 nan이 나오지 않도록 안전한 함수들을 사용해야 한다.
- 쓸데없이 gpu 메모리를 많이 사용하지 않도록 해야한다.
1번의 경우 gpu로 할 수 있는 연산의 특성을 알면 편하다.
답을 구하는데 있어서 순차적인 연산으로 해결 하기 보다는
관점의 전환을 통해 답을 구하는데 쓸 수 있는 독립적이지만
반복적으로 할 수 있는 연산을 찾으면 좋다.
2번의 경우 logsumexp와 log(sum(exp()))의 차이에 대해 알면 된다.
3번의 경우 함수가 도중에 필요한 값을 필요할 때 계산하게 해서
필요하지 않은 타이밍에 오래동안 저장하지 못하게 해야한다.
이 부분은 개인적인 경험이지만 간단하게 코드 위치를 변경한 것 만으로
batch size를 2배로 키울 수 있었던 것을 생각해 보면 나 뿐 아니라 다른 사람들에게도 유효할 거 같다.