상세 컨텐츠

본문 제목

Auto Labeling

프로젝트

by 송연어 2020. 4. 14. 11:48

본문

Auto Labeling은 레이블이 되어있지 않은 데이터에 레이블링을 해주는 기법입니다. 실생활에서 데이터를 수집하면 당연히 레이블링이 되어 있지 않고 직접 레이블을 달아주는 작업을 수행합니다. 100개의 데이터까진 직접 레이블링 할 수 있겠지만 만개,십만개 이상의 데이터에 직접 레이블을 달아줄 순 없습니다. 이런 상황에서 소수의 데이터에 레이블을 직접 달아주고 AI 모델에 학습시켜 다수의 데이터에 레이블링을 해주는 방법입니다. 

 

제가 진행했던 AI Cover Letter 프로젝트를 예제로 Auto Labeling을 설명하겠습니다. 저희는 자기소개서 데이터가 필요하기 때문에 잡코리아에서 합격자소서를 크롤링해왔습니다. 

 

qus: 자소서 질문 항목, ans : 합격자소서 답변

자소서 데이터의 레이블은 빈출 문항 9가지로 추려서 선정했습니다.

 

빈출 질문 9가지 

label No. 질문 문항
0 성장과정
1 성격 장단점
2 직무역량
3 지원동기
4 사회경험
5 경력사항
6 사회이슈
7 조직적응력
8 문제해결력

 

총 24058개의 질문답변 문항을 크롤링하였고 이 중, 약 1,200개가량을 직접 레이블링을 해주었습니다.

 

1,200개의 문항에 할당된 각 레이블 카운트 값

 

위 그래프는 1,200개의 문항에 할당된 레이블을 카운트한 barplot입니다. 이상한 점이 있다면 개수의 총합이 1,200개가 아닙니다. 저희는 multi-labeling 기법으로 레이블링을 해주었고 하나의 문항에 복수의 레이블이 할당되었기 때문입니다.  

 

multi-labeling

multi-labeling을 시도한건 직접 라벨링을 달아주는 작업을 수행하다보니 문제점이 있었기 때문입니다. 질문 문항 하나가 하나의 라벨에만 해당되지 않는다는 점이었습니다. 한 가지 예를 들어보겠습니다.

 

ex) 귀하가 스스로 문제를 발견하고, 
이를 해결했던 경험에 대해 기술해 주세요.

(사회경험 문항이면서 문제해결력 문항에도 속하는 듯 합니다 )

 

하나의 질문에 [4,8]의 레이블이 할당되야 한다고 생각해서 multi-labeling을 사용했습니다. 또한, label은 9차원 array형식으로 만들어 주어야 했는데, 보통 one-hot-encoding 형식의 array로 만들어 주었습니다. 하지만 multi-labeling은 one-hot-encoding으로 표현될 수 없습니다. 하나의 벡터에 두 개 이상의 값이 주어지기 때문입니다. 이에 many-hot-encoding 방식을 사용하기로 했습니다.

 

ex) one-hot과 many-hot의 차이

ont-hot-encoding
[0,0,0,1,0,0,0]
many-hot-encoding
[1,0,1,0,0,1,1]

many-hot-encoding은 multi-label classification 방식으로 multi-class classification과는 다릅니다. multi-class 분류 방식은 여러 개의 선택지 중 하나만을 선택하는 것이라면, multi-label은 여러 개의 선택지 중 여러 개를 선택하는 방식입니다.

 

multi-class 와 multi-label의 차이

multi-class의 이미지를 보면 여러 개의 과일 중, 사과 하나만을 선택했습니다. 하지만 우리가 원하는 건 사과뿐만 아니라 배도 선택하는 것입니다. 이런 상황에서 multi-label을 활용하면 사과와 배를 모두 선택할 수 있습니다. 

 

 

multi-labeling된 레이블을 many-hot-encoding형식으로  바꿔서 Y train 값으로 사용할 데이터를 만들었습니다. 

 

human_label: 사람이 직접 단 레이블 값

 

mh_encoding: many hot- encoding된 레이블

 

약 1,200개의 질문문항에 many-hot-encoding을 진행한 데이터입니다. 9차원의 벡터값이 부여되었는데, 카테고리 0~9에 해당되는 값에 1을 주어 해당 질문이 해당 카테고리에 속한다는 의미입니다. 

 

Model

 

multi-labeling된 1,200개의 train데이터를 가지고 학습을 진행했습니다. multi-label classification과 multi-class classification의 큰 차이점은 모델 마지막 단계에서 드러납니다. 

model = Sequential()
e = Embedding(vocab_size, dim_embed, weights=[embedding_matrix], \
			input_length=max_len, trainable=False)
model.add(e)
model.add(Flatten())
model.add(Dense(100, activation='sigmoid'))
model.add(Dropout(0.2))
model.add(Dense(100, activation='sigmoid'))
model.add(Dropout(0.2))
model.add(Dense(9, activation='sigmoid'))
sgd =SGD(lr= 0.01)
model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['acc'])

출력층의 활성화함수를 sigmoid를 사용한다는 점이 큰 차이입니다. multi-class classification은 one-hot-encoding된 다차원의 array를 사용했습니다. 그리고 단 하나의 값이 정답이기 때문에 확률이 가장 높은 값 하나만을 추려냈습니다. 이러한 경우엔 softmax를 활성화함수로 사용해서 총합이 1인 확률값을 출력해도 무방합니다. 하지만 multi-label classification은 softmax를 사용할 수 없습니다. 다차원 array의 각 label들이 서로 배타적이어야 하기 때문입니다. 

 

예를 들어, one-hot encoding과 many-hot encoding된 벡터가 존재할 때, 

 

ont-hot-encoding
[0,0,0,1,0,0,0]
many-hot-encoding
[1,0,1,0,0,1,1]

 

one-hot-encoding 벡터의 softmax를 거친 output은 원소의 총합이 1인 벡터값을 가집니다.

 

[0.2,0.1,0.0,0.6,0.0,0.1,0.0]

하지만 many-hot-encoding에 softmax 함수를 적용하면 서로의 값에 영향을 받습니다.

[0.3, 0.0, 0.3, 0.0, 0.0, 0.2, 0.2]

이럴 경우, 정확한 레이블 값을 부여하는 데 혼란을 줄 수 있습니다. 하지만 sigmoid 함수를 사용하면 문제를 해결할 수 있습니다. sigmoid는 label 원소가 서로 배타적이기 때문입니다. 그렇기 때문에 다음과 같은 원소 값을 출력할 수 있게 해줍니다.  

[0.9, 0.0, 0.8, 0.0, 0.0, 0.8, 0.9]

 

모델에 학습한 후, 1,200개의 데이터를 제외한 11,000개의 데이터에 레이블링을 부여해 주었습니다.

 

test data 레이블 카운트

 

barplot을 보면 train 데이터의 barplot과는 다르게 1번 레이블의 비중이 높고 6,7,8번 레이블이 굉장히 낮습니다. 

 

 

 

11월 29에 프로젝트를 완료했지만 부족했던 부분을 보완해서 다시 진행 중입니다.

 

contributor : 천성욱,박승근

github : https://github.com/seongwookchun/AI-Coverletter-Assistant/tree/fromzero

 

seongwookchun/AI-Coverletter-Assistant

Just give some letters and press the tab then get the full sentence - seongwookchun/AI-Coverletter-Assistant

github.com

 

 

 

 

 

 

'프로젝트' 카테고리의 다른 글

Tabditor 프로젝트  (1) 2019.12.16

관련글 더보기

댓글 영역