본문 바로가기
Coursera 강의/Deep Learning

ML Strategy 2-2 (Transfer learning, Multi-task learning, End-to-end learning)

by 별준 2020. 10. 30.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 세 번째 강의 Structuring Machine Learning Projects를 듣고 정리한 내용입니다. (Week 2)

- Learning from multiple tasks

[Transfer learning]

딥러닝의 강력함은 한 가지 Task에서 학습한 내용은 다른 Task에 적용을 할 수 있다는 것이다. 예를 들어서, Neural Network(NN)이 고양이와 같은 사진을 인식하도록 학습했을 때, 여기서 학습한 것을 가지고 부분적으로 X-ray 이미지를 인식하는데 도움이 되도록 할 수 있다. 이것이 바로 Transfer Learning이라고 한다.

 

 

 

이미지 인식 기능을 NN으로 학습을 했다고 해보자. \(x\)는 이미지이고, \(y\)는 some object(인식 결과)이다. 이미지는 고양이나, 개, 또는 새 등이 될 수 있다. 이렇게 학습한 NN을 사용해서 transfer한다고 표현하는데, 고양이와 같은 사진을 인식하도록 학습한 것이 X-ray Scan을 읽어서 방사선 진단에 도움이 될 수 있다. Transfer Learning은 다음과 같이 적용한다. 

우선, 학습한 신경망 네트워크의 마지막 output layer를 삭제하고, 마지막 layer의 파라미터, weight(and bias)도 삭제한다. 그리고, 마지막 layer를 새로 만들고, 무작위로 초기화된 weight를 만든다. 이렇게 생성한 layer들을 통해서 진단의 결과값을 나타내는 것이다.

구체적으로 설명하자면, 이미지 인식 업무에 관련해서 파라미터를 학습을 시킨 것을 사용하는 것이고, 이 학습 알고리즘을 방사선 이미지에 transfer를 진행한다. data set (x, y)를 방사선 이미지로 바꾸어 주고, 마지막 output layer의 파라미터 \(W^{[L]}, b^{[L]}\)을 초기화시킨다. 그리고 새로운 dataset에서 NN을 다시 학습시키면 된다.

 

 

기존 학습 알고리즘을 가지고 다시 학습하는 경우에 방법이 새로운 dataset에 따라서 두 가지의 방법이 있다.

만약, 방사선 이미지 dataset이 많지 않다면, 마지막 층의 파라미터만 초기화하고 나머지 layer의 파라미터는 고정시켜서 학습시킬 수 있다. 만약, 데이터가 충분히 많다면, 나머지 layer에 대해서도 다시 학습시킬 수 있다.

(경험상, dataset의 크기가 작다면 output layer만 다시 학습하거나, 마지막 2개 layer정도만 다시 학습시키는 것이 좋다.)

모든 layer의 파라미터를 다시 트레이닝시키는 경우에, 이미지 인식 기능에 대해서 첫번째 학습을 Pre-training이라고 부른다.(신경망의 파라미터를 pre-initialize or pre-training하기 위해서 이미지 인식 데이터를 사용하기 때문)

그리고, 방사선 이미지에 학습시키는 두번째 단계를 종종 fine tuning이라고 한다.

 

이렇게 이미지 인식 기능에서 학습한 내용을 방사선 이미지를 인식하고 진단하는 것으로 이양(transfer)시킨 것이다. 이것이 가능한 이유는 edges를 감지하거나, curve를 감지, 또는 positive objects를 감지하는 low level features(특성) 때문이다. 이미지 인식을 위한 데이터셋(고양이, 개 등)에서 이미지의 구조, 이미지가 어떻게 생겼는지에 대해서, 즉, 이미지들의 부분부분들을 인식하도록 학습한 것들이 (가지고 있는 방사선 이미지 dataset이 적더라도)방사선 이미지 인식에도 유용할 수 있다. 

 

다른 예제인, 음성 인식 시스템으로 다시 살펴보자.

 

 

우리가 음성 인식 시스템을 학습했다고 한다면, 입력 x는 오디오가 될 것이고, y는 해석(ink transcript)가 될 것이다. 이제, 우리는 wake word(trigger word)를 감지하는 시스템을 만들고 싶어한다면, NN의 마지막 layer를 삭제하고 새로운 output layer를 만들어야 한다. 종종, 마지막 output layer를 하나로만 생성하는 게 아니라, 여러개의 새로운 layer를 생성할 수도 있다. 그리고, 우리가 학습시키고자 하는 data를 얼마나 보유하고 있느냐에 따라서, 새롭게 생성한 layer만 학습하느냐 또는 더 많은 layer들을 학습하느냐 선택할 수 있다.

 

위의 예제들로부터 우리는 Transfer Learning는 언제 적용해야되는지 파악할 수 있을 것이다.

우리가 transfer하고자하는 곳의 data가 많고, transfer하려고하는 곳에 data가 적을 때 효과적일 것이다. 

예를 들어, 이미지 인식 업무를 위한 데이터가 100만개가 있으면, 이 정도 데이터는 low level의 특성을 배우기에 충분할 것이다. 하지만, 방사선 이미지 인식을 위한 데이터는 매우 적게, 100개의 이미지만이 있다고 하자. 그렇다면, 이미지 인식 기능에서 학습한 것들이 방사선 이미지로 transfer되어서 사용되면, 방사선 이미지의 데이터가 많지 않더라도 도움이 될 수 있다. 

음성 인식 기능도 마찬가지다. 음성 인식 기능에서 10000시간의 데이터로 학습을 했지만, trigger word감지를 위한 데이터는 1시간 분량밖에 되지 않을 때, 음성 인식 기능에서 어떻게 듣는지 배우는 부분들이 trigger word감지 기능을 학습하는데 도움을 줄 수 있다.

 

당연히 반대의 경우에는 Transfer Laerning이 불가능하다.

정리하자면, Transfer Learning은 Task A와 Task B가 같은 입력(이미지나 음성같은)으로 구성되어 있고, Task A의 데이터가 Task B의 데이터보다 훨씬 더 많은 경우에 가능하다. 조금 더 추가하자면, Task A에서 학습하는 low level 특성이 Task B를 학습하는데 도움이 될 수 있다고 판단되는 경우에 사용할 수 있다.

 

[Multi-task learning]

Transfer Learning이 순차적으로 Task A를 학습하고 Task B로 넘어가는 절차가 있었다면, Multi-task Learning은 동시에 학습을 진행한다. NN이 여러가지 Task를 할 수 있도록 만들고, 각각의 Task가 다른 Task들을 도와주는 역할을 한다.

 

우리가 자율주행 자동차를 만든다고 생각해보자. 이런 자율주행 자동차는 보행자나 다른 차량, 정지 표지판, 신호등 등을 잘 감지해야 한다.

 

 

위 왼쪽 이미지를 보면, 정지 표지판과 차량이 있고, 보행자나 신호등은 보이지 않는다. 이 이미지가 input \(x^{(i)}\)라고 한다면, output \(y^{(i)}\)는 하나의 label이 아닌 4개의 label이 필요할 것이다. 만약 더 많은 것들을 감지하려고 한다면, 4개가 아니라 더 많은 label을 가질 수 있을 것이다.(여기서는 4개만 감지한다고 가정한다)

그러면 \(y^{(i)}\)는 4x1 vector가 되고, dataset 전체를 참조하면, Y matrix는 오른쪽 아래처럼 4 x m matrix가 된다. 

우리는 y값을 예측하기 위해서 NN을 학습시키는 것이고, input \(x\)를 가지고, output \(\hat{y}\)를 구하는게 목적이다.

 

 

위의 Neural Network를 학습하기 위해서는 NN의 Loss를 정의해야 한다. 

예측값은 4x1 vector인 \(\hat{y}\)이기 때문에, Loss는 다음과 같이 구할 수 있다.

\[\text{Loss } = \frac{1}{m}\sum_{i = 1}^{m}\sum_{j = 1}^{j = 4}\mathscr{L}(\hat{y}_j^{(i)}, y_j^{(i)})\]

그리고 Loss는 보통 Logistic Loss를 사용하고, \(\mathscr{L}(\hat{y}_j^{(i)}, y_j^{(i)}) = -y_j^{(i)}log(\hat{y}_j^{(i)}) - (1 - y_j^{(i)})log(1 - \hat{y}_j^{(i)})\) 이다.

 

여기서 이미지는 복수의 label을 가질 수 있다. 따라서, 우리는 이미지가 보행자나 자동차, 정지 표지판, 신호등으로 판단하는 것이 아니라, 하나의 이미지에 대해서 보행자, 차량, 정지 표지판, 신호등이 있는지 판단하는 것이기 때문에, 여러 개의 물체가 같은 이미지에 존재할 수 있다는 것이다. 여기서 결과는 4개의 label을 가지고, 이미지가 4개의 물체를 포함하고 있는지 알려주는 역할을 한다.

 

우리가 사용할 수 있는 또 다른 방법은 4개의 NN을 각각 트레이닝시키는 것이다. 하지만 NN의 초반 특성들 중의 일부가 다른 물체들과 공유될 수 있다면, 이렇게 4개의 NN을 각각 트레이닝시키는 것보다, 한 개의 NN을 학습시켜서 4개의 일을 할 수 있도록 하는 것이 보통 더 좋은 성능을 갖는다.

 

부가적인 내용으로, 이제까지 학습을 하기 위한 데이터의 label이 모두 달려있는 것처럼 설명했지만, multi-task learning은 어떤 이미지가 일부 물체에 대해서만 label이 되어 있더라도 잘 동작한다. 

 

 

위 레이블처럼 레이블하는 사람이 귀찮거나, 실수로 레이블하지 않았아서 물음표로 나타나더라도 알고리즘을 학습시킬 수 있다. 이런 경우에 Loss를 구할 때에는 물음표는 제외하고 y의 값이 0이거나 1인 것들만 취급해서 Loss를 구한다.

 

Multi-Tasking은 언제 사용할 수 있을까?

 

 

첫 번째로 각각의 task들을 학습할 때, lower-level 특성을 서로 공유해서 유용하게 사용될 수 있는 경우에 가능하다. 

두 번째는 필수 규칙은 아니고, 항상 옳지도 않지만, 각각의 task의 dataset의 양이 유사할 때 가능하다. 엄격하게 적용되는 것은 아니지만, multi-task learning이 효과가 있으려면, 보통 다른 task들의 data의 합이 하나의 task의 양보다 훨씬 많아야 한다.

마지막은, 충분히 큰 neural network에서 학습시키는 경우에 잘 동작한다. Rich Carona 연구원은 multi-task learning이 각각의 NN으로 학습하는 것보다 성능이 좋지 않다면, NN이 충분히 크기 못하는 경우라는 것을 발견했다.

 

실제로, multi-task learning은 transfer learning보다 훨씬 더 적게 사용되며, transfer learning의 경우에는 data는 적지만, 문제 해결을 위해 사용되는 경우를 자주 보게 된다.

예외적으로 computer vision object detection영역에서는 transfer learning보다 multi-task learning이 더 자주 사용되며, 개별적인 NN으로 학습하는 것보다 더 잘 동작한다.

 

- End-to-end deep learning

[What is end-to-end deep learning]

최근 개발된 것 중에 흥미로운 것 중 하나는 End-to-end deep learning의 발전이다. End-to-end deep learning은 여러 단계의 process를 거치는 것들을 하나의 NN으로 변환하는 것이다. 

예제를 통해서 자세하게 살펴보자.

 

 

 

음성 인식을 예로 들어보면, input x인 오디오를 사용해서 output y에 매핑하면 오디오 클립이 글로 옮겨지게 되는 것이다. 이전에 음성 인식은 많은 단계가 필요했다. 먼저, 오디오의 hand-designed feature(사람이 직접 feature들을 지정)들을 추출한다. MFCC라는 알고리즘을 사용할 수 있는데, 이 알고리즘은 오디오의 hand-designed feature와 low-level feature를 추출하는 알고리즘이다. 그리고 머신러닝을 적용해서 Phonemes(음소; 소리의 기본단위)를 추출한다. 그런 다음에 음소들을 묶어서 words 형태로 만들고, 글로 나타낸다.

반대로 End-to-end deep learning은 하나의 거대한 Neural Network를 학습시켜서, 오디오 클립을 입력하고 다이렉트로 문자로 출력하도록 하는 것이다. 

End-to-end learning이 효과를 나타내기 시작하면서, 많은 연구원들이 개별적인 단계를 설정하기 위해서 파이프라인을 설계하는 시간을 줄이게 되었다. 

 

End-to-end deep learning은 기존과 달리 중간 단계들을 우회한다. End-to-end deep learning이 잘 동작하기 위해서는 많은 양의 데이터가 필요하다. 예를 들어서, 음성 인식을 위한 3000시간의 데이터가 있을 때, 기존의 중간 과정이 있는 파이프 라인에서는 잘 동작하지만, End-to-end deep learning은 10,000시간 또는 최대 100,000시간의 많은 데이터가 있는 경우에 잘 동작한다. 따라서, 데이터가 작다면 전통적인 파이프라인을 통한 학습이 실제로 더 잘 동작한다. 

만약 중간 정도 양의 데이터가 있다면 파이프라인과 End-to-end deep learning의 중간 방법을 사용할 수 있다.

 

 

 

얼굴 인식 예제로 Pipeline 방식과 End-to-end deep learning을 조금 더 살펴보도록 하자.

 

 

위 시스템은 카메라가 문에 접근하는 사람의 얼굴을 확인하고, 인식하면 회전식 출입문을 자동으로 통과시켜주는 시스템이다. 따라서 ID Card 등을 들고다니지 않아도, 건물 안으로 들어갈 수 있다. 이 시스템은 어떻게 구축하면 될까?

가능한 방법 중의 한 가지는 카메라 캡처한 이미지를 인식하는 것이다. 사람이 출입문에 다가가면 카메라가 캡처하고 캡처한 이미지를 input x로 사용하고, 사람의 ID인 ouput y로 매핑하는 것이다. 

위 방법의 문제점은 출입문에 접근하는 사람이 다양한 방향에서 접근할 수 있다는 것이다. 즉, 위 이미지에서 녹색 위치거나 파란색 위치일 수도 있고, 보라색처럼 매우 가까이 있어서 얼굴이 너무 크게 보일 수도 있다. 즉, 이 시스템을 구축하기 위해서 사용할 수 있는 최선의 방법은 End-to-end deep learning 방식으로 raw image를 사용해서 NN으로 ID를 알아내는 것이 아니라, 여러 단계로 나누는 것이다.

 

 

먼저, 첫번째 감지기는 사람의 얼굴이 이미지의 어디에 있는지 알아낸다. 그리고 그 사람의 얼굴을 발견하면, 그 이미지 부분을 자르고 확대해서 얼굴이 가운데로 오게 한다. 그런 다음에 이 이미지를 NN에 입력으로 사용해서 학습을 해서 동일인물인지 비교하는 방법 등을 통해서 사람의 ID를 파악할 수 있다. 

두번째 접근 방법인 두 개의 학습 알고리즘을 사용하는 것이 전체적으로 더 좋은 성능을 보여준다. 

 

왜 두번째 방법이 더 효과적일까?

우선 각각의 알고리즘이 해결하고자하는 문제가 단순하다는 것이다. 두번째는 각각의 알고리즘 학습을 위한 데이터가 충분히 많다는 것이다. 특히나 face detection을 위한 데이터는 매우 많다. 그리고, 동일 인물인지 아닌지 알아내기 위한 데이터도 무수히 많다. 

대조적으로 End-to-end deep learning 방식으로 모든 것을 동시에 학습하려고 시도한다면, x->y로 매핑되는 데이터가 매우 적을 것이다. 따라서 End-to-end deep learning 방법으로 해결하기 위해서 충분한 데이터는 없지만, 실제로 단계를 나누어서 하위 문제를 해결하기 위한 데이터는 충분하므로, 단계를 나누어서 해결하는 것이 더 효과적이다. 물론, 필요한 데이터가 충분하다면, 아마도 End-to-end 접근 방법이 더 효과적일 것이다. 

 

 

 

기계 번역을 예로 들어보면, 전통적으로 기계 번역 시스템은 복잡한 파이프라인으로 구성되어 있는데, 영어 텍스트를 가지고 여러 단계를 거쳐서, 프랑스어로 번역하게 된다. 오늘날에는 꽤 많은 (영어, 프랑스어) 매칭 데이터가 있기 때문에, 이런 경우에는 end-to-end deep learning이 기계 번역에서 매우 효과적일 수 있다.

 

또 다른 예시로, 아이의 손 X-ray 사진을 가지고, 나이를 추정하는 시스템을 살펴보자. 해당 시스템은 아이가 정상적으로 성장하고 있는지 확인하는데 사용될 수 있다.

먼저 이미지를 살펴보면서 뼈 부분, 뼈 조각의 위치, 다른 뼈의 길이를 알면 아이들의 평균 손 뼈 길이표를 대조해서 아이의 나이를 추정할 수 있고, 단계를 나누는 것이 꽤 효과가 있다. 반대로, end-to-end 접근 법으로 이미지에서 아이들의 나이를 바로 매핑한다면, 잘 동작하지 않을 수 있고 매우 많은 데이터가 필요할 것이다. 첫번째 접근 방법에서 각 단계는 비교적 간단한 문제이고, 많은 데이터가 필요하지 않을 수 있다. 따라서 충분한 데이터를 모으기 전까지는 첫번째 접근 방법이 end-to-end 방법보다 더 효과적일 수 있다.

 

[Whether to use end-to-end deep learning?]

그렇다면 언제 end-to-end deep learning을 사용할 수 있을까? 장단점을 살펴보면서 가이드라인을 알아보자.

 

 

장점은 다음과 같다.

1. 완벽한 학습을 통해서 데이터가 말을 하는 것처럼 할 수 있다. 우리가 충분히 많은 데이터를 가지고 있다면, X -> Y에 매핑되는 기능을 만들어낼 수 있다. 예를 들어서, 이전의 음성 인식 시스템에서는 단어의 기본 음절 단위를 가지고(음성학) 해석을 하는데, 학습 알고리즘이 음성학적으로 생각하지 않고, 음성 표현이 바로 해석된다면, 전체적인 성과는 더 좋아질 것이다.

2. 수작업이 줄어든다. 이 경우에는 워크플로우가 단순해지고, 중간 과정들을 설계하는데 많은 시간을 투자하지 않아도 된다.

 

단점은 다음과 같다.

1. 데이터가 많이 필요하다. X-Y 매핑을 바로 하기 위한 데이터가 필요하다. 이전 강의에서는 하위 작업인 얼굴 인식과 얼굴을 식별하기 위한 데이터들은 많았지만, 이미지를 바로 식별하기 위한 데이터는 거의 없었다. 그래서 이런 시스템을 훈련시키기 위해서는 입력과 출력이 모두 필요한 데이터가 필요하다.

2. 유용하게 수작업으로 설계된 component들을 배제한다는 것이다. 데이터가 많지 않다면, train set으로 얻을 수 있는 것이 적고, 잘 설계된 hand-designed component를 사용하는 것이 더 좋은 성능을 낼 수 있다.

 

 

 

End-to-end deel learning을 적용하기 위해서 중요한 질문은, x -> y로 매핑시키기 위해 필요한 데이터가 충분히 많은가의 여부이다. 이전 강의에서 봤듯이, 뼈를 인식하는 것과 인식 뼈를 토대로 나이를 추정하는 것은 데이터가 많이 필요하지 않을 수 있지만, 뼈 사진을 통해서 바로 나이를 매핑하는 것은 복잡한 문제처럼 보이고, 많은 데이터가 필요할 것이다. 

 

다른 예시로 자율주행 차는 어떻게 만들 수 있을까?

한 가지 할 수 있는 방법 중에 하나는 다음과 같다.

 

 

이미지, radar, lidar를 통해서 주변 사물(자동차, 보행자 등)들을 인지하고, 그 다음에 어떤 길로 갈지 결정한다. 그런 다음에 적절한 steering과 가속/제동 명령을 실행한다. 이 예시가 보여주는 것은 머신러닝이나 딥러닝을 사용해서 구성 요소들을 개별적으로 학습하고 적용할 때, 할 수 있는 작업에 따라 학습하려는 X->Y 매핑 유형을 신중하게 선택해야한다는 것이다. 

대조적으로 End-to-end deep learning 방식은 이미지를 입력하고, steering을 직접 출력하는 것이고, 접근법이 꽤 흥미롭다. 하지만, data availability와 NN을 통해 배울 수 있는 유형을 고려할 때, 이것은 실제로 가장 유망한 접근 방법/최선의 접근 방법이 아니라고 생각한다.

 

따라서 End-to-end deep learning이 정말 잘 동작하고, 효과가 있을 수 있지만, 어디에 적용할 수 있는지 알고 있어야 한다.

댓글