- Hyunseok Hwang
Multitask-learning의 이해
현재 미국 전기차 업체 테슬라는 상당한 수준의 자율주행 능력을 보여주는데 그 배경에는 Multitask-learning의 개념이 뒷받침 되어있습니다. 자율주행 자동차는 부착된 카메라를 통해 받아오는 실시간 도로 상황의 이미지를 이용해 사물분류, 차선감지, 표지판 탐색, 그리고 도로 마크인식 등등 여러 문제를 동시에 풀어야 합니다.
위에서 나열한 문제를 해결하기 위해서 각각의 신경망을 만들고, 학습시키고, 추론하는 과정을 개별적으로 한다면 굉장히 시간, 계산적으로 많은 비용이 소모가 될 것으로 예상됩니다. 단일 신경망으로 이 모든 문제를 동시에 해결 할 수 있는 방법은 있지 않을까요? 해답은 1996년 ICML에서 발표된 "Algorithms and applications for multitask learning"[1]에서 찾아 볼수 있습니다. 해당 연구는 풀고자 하는 문제의 유사성을 이용하여 풀이하는 동안 서로 도움을 줄 수 있도록 하는 multitask-learning 연구의 본격적인 시발점이 됩니다.
Multitask-learning를 위한 신경망은 상부 계층은 상대적으로 큰 신경망으로, 그리고 문제(task)에 대해서는 상대적으로 작은 신경망으로 문제에 맞는 하부 계층 구조로 이루어져서, 입력데이터를 받아 각각 문제에 맞는 신호로 출력합니다. 위 그림과 같이 하부 신경망에서는 각각의 문제에 맞는 값들을 출력하게 될 것입니다. 이 예시는 큰 신경망이 사람의 나이 성별, 질병 등의 정보를 입력 받고 작은 신경망이 건강과 관련된 각종 수치를 계산하는 과정을 보여줍니다.
하나의 데이터로 여러 문제를 동시에 풀 수 있다는 장점 외에도 Multitask-learning의 주요한 다른 이점은 Inductive Transfer로써, 별도의 문제를 푸는 과정에서 신경망 내부의 정보가 모든 문제에 도움을 준다는 데 있습니다. 구체적으로 이야기를 하면 각각의 문제가 다른 목적을 해결하지만, 공통 입력 데이터를 받아들이고 인식하는 부분에는 서로 공통점이 있습니다. 그래서 만약 특정 데이터에서 A 문제에는 정답 레이블이 존재하고 B 문제에는 그렇지 않은 상황에서, A 문제를 해결하는 과정에서 직접적으로 B 문제를 해결 할 수는 없을 지라도 간접적으로 문제 해결에 도움을 주는 효과가 있습니다. 초기 Multitask-learning 문헌의 저자는 그런 이점을 Eavesdropping이라고 재미있게 표현 했습니다.
Multitask-learning의 방식은 크게 두 가지로 분류됩니다. 하나는 직접 신경망 파라미터를 공유하는 Hard parameter sharing 방식 , 다른 하나는 독립된 신경망이지만 파라미터가 유사하게 학습하도록 만드는 Soft parameter sharing 방식입니다. 처음 Multitask-learning의 아이디어가 Hard parameter sharing 구조에 대해서 제시되었고 그에 따른 후속 연구들이 진행되어 나갔으나, 자연어 처리분야에서의 Multitask-learning은 Soft parameter sharing 구조가 좋은 성능을 보였다고 발표한 연구[3,4]등이 제안 되었습니다. 아래에서 두 방법의 핵심 아이디어 및 더 직관적인 이해를 위한 샘플 코드를 설명 드리도록 하겠습니다.
Hard parameter sharing
각 문제가 신경망 일부를 직접 공유하는 방식입니다.

그림과 전체 네트워크는 Task 간 공유하는 Shared layers와 각 Task 별로 구분 되는 Task-specific layers로 구분되며, 전자는 서로 다른 Task을 해결하기 위한 공통적인 representation을 배우고, 후자는 각 Task를 직접적으로 해결하는 역할로 구분 됩니다. 이미지 Task들을 위한 Multitask-learning에 예제 코드를 보도록 하겠습니다. 예를 들어 VGG16의 feature layers를 "Shared layers"로 이용하고, 저희가 새롭게 풀고 싶은 서로 다른 Task 두 개를 각각 (1) 제품 이미지로부터 불량품 판정 (Anomaly detection) (2) 자동차 종류 분류 (Multi-class classification)라고 하겠습니다.
1 # Hardparameter sharing2vgg16_model =
2 torchvision.models.vgg16(pretraind=True)# Vgg16 기본 모델 호출
3 shared_layers = vgg16_model.features[:]# Vgg16 hidden layer까지 설정된 모델
다음으로 우리가 가정한 두 개의 문제에 대한 Task-specific layers를 정의하도록 하겠습니다.
1 class TaskLayers(nn.Module):
2 def __init__(self):
3 super(TaskLayers,self).__init__()
4 self.task_nets = nn.ModuleList()
5 self.task_nets.append(...)# Anomaly detection을 위한 신경망.
6 self.task_nets.append(...)# Multi-class classification을 위한 신경망.
7 def forward(self,x):
8 return tuple(task_net(x) for task_net in self.task_nets)
전체 네트워크는 shared_layers와 TaskLayers를 결합하여 생성하면 완성이 됩니다.
1 class HardParameterSharing(nn.Module):
2 def __init__(self):
3 super(Hardsharing,self).__init__()
4 self.model=nn.Sequential()
5 self.model.add_module('shared_layer',shared_layers)
6 self.model.add_module('flatten',nn.Flatten(start_dim=1))
7 self.model.add_module('task_layer',TaskSpecificLayers())
8 def forward(self,x)->Tuple:
9 return self.model(x)
Soft parameter sharing
Hard parameter sharing방식과는 달리 각 Task마다 고유의 신경망을 부여하는 형태입니다. 다만, inductive transfer라는 개념을 도입하기 위해서 각각의 신경망을 학습할때 신경망 파라미터간의 거리(e.g. Euclidean)를 제한해주는 방식을 이용합니다.

각각의 문제간 구분 지어야 할 신경망 계층이 분명히 달리 존재하니 Hard parameter sharing일 때처럼 Shared layers는 존재하지 않지만, Inductive transfer를 따로 적용하는 위 식에 해당하는 파라미터의 특정 부분을 Constrained layers라고 부를 수 있습니다.

Soft parameter sharing 구현 방식은 위 예시와는 달리 동일한 구조의 독립적인 모델 A, B를 미리 만들었다고 가정하고 구현해보겠습니다.
1 model_a = Model()
2 model_b = Model()
이제 두 모델을 하나의 단일 신경망으로 묶고, 파라미터의 거리를 제한하는 방식을 살펴보겠습니다.
1 class SoftParameterSharing(nn.Module):
2 def __init__(self,model_a,model_b):
3 super(Softsharing,self).__init__()
4 self.task_nets = nn.ModuleList()
5 self.task_nets.append(model_a)
6 self.task_nets.append(model_b)
7
8 def soft_loss(self):
9 loss = 0
10 for parameter_pair in zip(*[task_net.named_parameters() for task_net in self.task_nets]):
11 loss += torch.linalg.norm((parameter_pair[0][1]-parameter_pair[1][1]))
12 return loss
13
14 def forward(self,x):
15 return tuple(task_net(x) for task_net in self.task_nets)
SoftParameterSharing 내부에 두 모델의 파라미터 거리가 벌어지면 penalty가 발생하는 soft_loss를 작성했습니다. 해당 soft_loss 를 통해 두 모델은 서로의 parameter를 유사하게 유지 하는 제약 조건 하에 각자의 Task를 학습하게 됩니다.
저희 알세미는 Multi-task learning 알고리즘을 적절히 이용하면 다양한 반도체 device에 대한 compact modeling 문제 (Multi-task가 주어진 상황)에서 도움을 줄 수 있다고 생각하고 있습니다. 신경망에서 Shared-layer, 또는 Constrained-layers의 정보를 잘 활용하여 자체 데이터만으로는 좋은 representation을 배우기 어려운 문제를 해결하거나, 다양한 환경의 device를 한번에 학습하고 추론하는 상황에서 속도를 향상 시키는 등의 적용을 고민하고 있습니다. 이와 관련되어 연구 성과가 나온다면 추후에 관련된 포스팅을 업로드 할 예정이니 관심을 가지고 봐주시면 감사하겠습니다! 🙂
Reference.
[1] Caruana, Rich. "Algorithms and applications for multitask learning." ICML. 1996.
[2] Ruder, Sebastian. "An overview of multi-task learning in deep neural networks." arXiv preprint arXiv:1706.05098 (2017).
[3] Duong, Long, et al. "Low resource dependency parsing: Cross-lingual parameter sharing in a neural network parser." Proceedings of the 53rd annual meeting of the Association for Computational Linguistics and the 7th international joint conference on natural language processing (volume 2: short papers). 2015.
[4] Hashimoto, Kazuma, et al. "A joint many-task model: Growing a neural network for multiple nlp tasks." arXiv preprint arXiv:1611.01587 (2016).
[5] Caruana, Rich. "Multitask learning." Machine learning 28.1 (1997): 41-75.
[6] Li, Keqiang, et al. "Real-Time Monocular Joint Perception Network for Autonomous Driving." IEEE Transactions on Intelligent Transportation Systems (2022).
[7] https://avivnavon.github.io/blog/parameter-sharing-in-deep-learning/