beomi commited on
Commit
5b4ca19
·
1 Parent(s): 686333e

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +248 -0
README.md ADDED
@@ -0,0 +1,248 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - ko
4
+ - en
5
+ tags:
6
+ - electra
7
+ - korean
8
+ license: "mit"
9
+ ---
10
+
11
+
12
+ # KcELECTRA: Korean comments ELECTRA
13
+
14
+ ** Updates on 2022.10.08 **
15
+
16
+ - KcELECTRA-base-v2022 (구 v2022-dev) 모델 이름이 변경되었습니다.
17
+ - 위 모델의 세부 스코어를 추가하였습니다.
18
+ - 기존 KcELECTRA-base(v2021) 대비 대부분의 downstream task에서 ~1%p 수준의 성능 향상이 있습니다.
19
+
20
+ ---
21
+
22
+ 공개된 한국어 Transformer 계열 모델들은 대부분 한국어 위키, 뉴스 기사, 책 등 잘 정제된 데이터를 기반으로 학습한 모델입니다. 한편, 실제로 NSMC와 같은 User-Generated Noisy text domain 데이터셋은 정제되지 않았고 구어체 특징에 신조어가 많으며, 오탈자 등 공식적인 글쓰기에서 나타나지 않는 표현들이 빈번하게 등장합니다.
23
+
24
+ KcELECTRA는 위와 같은 특성의 데이터셋에 적용하기 위해, 네이버 뉴스에서 댓글과 대댓글을 수집해, 토크나이저와 ELECTRA모델을 처음부터 학습한 Pretrained ELECTRA 모델입니다.
25
+
26
+ 기존 KcBERT 대비 데이터셋 증가 및 vocab 확장을 통해 상당한 수준으로 성능이 향상되었습니다.
27
+
28
+ KcELECTRA는 Huggingface의 Transformers 라이브러리를 통해 간편히 불러와 사용할 수 있습니다. (별도의 파일 다운로드가 필요하지 않습니다.)
29
+
30
+ ```
31
+ 💡 NOTE 💡
32
+ General Corpus로 학습한 KoELECTRA가 보편적인 task에서는 성능이 더 잘 나올 가능성이 높습니다.
33
+ KcBERT/KcELECTRA는 User genrated, Noisy text에 대해서 보다 잘 동작하는 PLM입니다.
34
+ ```
35
+
36
+ ## KcELECTRA Performance
37
+
38
+ - Finetune 코드는 https://github.com/Beomi/KcBERT-finetune 에서 찾아보실 수 있습니다.
39
+ - 해당 Repo의 각 Checkpoint 폴더에서 Step별 세부 스코어를 확인하실 수 있습니다.
40
+
41
+ | | Size<br/>(용량) | **NSMC**<br/>(acc) | **Naver NER**<br/>(F1) | **PAWS**<br/>(acc) | **KorNLI**<br/>(acc) | **KorSTS**<br/>(spearman) | **Question Pair**<br/>(acc) | **KorQuaD (Dev)**<br/>(EM/F1) |
42
+ | :----------------- | :-------------: | :----------------: | :--------------------: | :----------------: | :------------------: | :-----------------------: | :-------------------------: | :---------------------------: |
43
+ | **KcELECTRA-base-v2022** | 475M | **91.97** | 87.35 | 76.50 | 82.12 | 83.67 | 95.12 | 69.00 / 90.40 |
44
+ | **KcELECTRA-base** | 475M | 91.71 | 86.90 | 74.80 | 81.65 | 82.65 | **95.78** | 70.60 / 90.11 |
45
+ | KcBERT-Base | 417M | 89.62 | 84.34 | 66.95 | 74.85 | 75.57 | 93.93 | 60.25 / 84.39 |
46
+ | KcBERT-Large | 1.2G | 90.68 | 85.53 | 70.15 | 76.99 | 77.49 | 94.06 | 62.16 / 86.64 |
47
+ | KoBERT | 351M | 89.63 | 86.11 | 80.65 | 79.00 | 79.64 | 93.93 | 52.81 / 80.27 |
48
+ | XLM-Roberta-Base | 1.03G | 89.49 | 86.26 | 82.95 | 79.92 | 79.09 | 93.53 | 64.70 / 88.94 |
49
+ | HanBERT | 614M | 90.16 | 87.31 | 82.40 | 80.89 | 83.33 | 94.19 | 78.74 / 92.02 |
50
+ | KoELECTRA-Base | 423M | 90.21 | 86.87 | 81.90 | 80.85 | 83.21 | 94.20 | 61.10 / 89.59 |
51
+ | KoELECTRA-Base-v2 | 423M | 89.70 | 87.02 | 83.90 | 80.61 | 84.30 | 94.72 | 84.34 / 92.58 |
52
+ | KoELECTRA-Base-v3 | 423M | 90.63 | **88.11** | **84.45** | **82.24** | **85.53** | 95.25 | **84.83 / 93.45** |
53
+ | DistilKoBERT | 108M | 88.41 | 84.13 | 62.55 | 70.55 | 73.21 | 92.48 | 54.12 / 77.80 |
54
+
55
+
56
+ \*HanBERT의 Size는 Bert Model과 Tokenizer DB를 합친 것입니다.
57
+
58
+ \***config의 세팅을 그대로 하여 돌린 결과이며, hyperparameter tuning을 추가적으로 할 시 더 좋은 성능이 나올 수 있습니다.**
59
+
60
+ ## How to use
61
+
62
+ ### Requirements
63
+
64
+ - `pytorch ~= 1.8.0`
65
+ - `transformers ~= 4.11.3`
66
+ - `emoji ~= 0.6.0`
67
+ - `soynlp ~= 0.0.493`
68
+
69
+ ### Default usage
70
+
71
+ ```python
72
+ from transformers import AutoTokenizer, AutoModel
73
+
74
+ tokenizer = AutoTokenizer.from_pretrained("beomi/KcELECTRA-base")
75
+ model = AutoModel.from_pretrained("beomi/KcELECTRA-base")
76
+ ```
77
+
78
+ > 💡 이전 KcBERT 관련 코드들에서 `AutoTokenizer`, `AutoModel` 을 사용한 경우 `.from_pretrained("beomi/kcbert-base")` 부분을 `.from_pretrained("beomi/KcELECTRA-base")` 로만 변경해주시면 즉시 사용이 가능합니다.
79
+
80
+ ### Pretrain & Finetune Colab 링크 모음
81
+
82
+ #### Pretrain Data
83
+
84
+ - KcBERT학습에 사용한 데이터 + 이후 2021.03월 초까지 수집한 댓글
85
+ - 약 17GB
86
+ - 댓글-대댓글을 묶은 기반으로 Document 구성
87
+
88
+ #### Pretrain Code
89
+
90
+ - https://github.com/KLUE-benchmark/KLUE-ELECTRA Repo를 통한 Pretrain
91
+
92
+ #### Finetune Code
93
+
94
+ - https://github.com/Beomi/KcBERT-finetune Repo를 통한 Finetune 및 스코어 비교
95
+
96
+ #### Finetune Samples
97
+
98
+ - NSMC with PyTorch-Lightning 1.3.0, GPU, Colab <a href="https://colab.research.google.com/drive/1Hh63kIBAiBw3Hho--BvfdUWLu-ysMFF0?usp=sharing">
99
+ <img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/>
100
+ </a>
101
+
102
+
103
+ ## Train Data & Preprocessing
104
+
105
+ ### Raw Data
106
+
107
+ 학습 데이터는 2019.01.01 ~ 2021.03.09 사이에 작성된 **댓글 많은 뉴스/혹은 전체 뉴스** 기사들의 **댓글과 대댓글**을 모두 수집한 데이터입니다.
108
+
109
+ 데이터 사이즈는 텍스트만 추출시 **약 17.3GB이며, 1억8천만개 이상의 문장**으로 이뤄져 있습니다.
110
+
111
+ > KcBERT는 2019.01-2020.06의 텍스트로, 정제 후 약 9천만개 문장으로 학습을 진행했습니다.
112
+
113
+ ### Preprocessing
114
+
115
+ PLM 학습을 위해서 전처리를 진행한 과정은 다음과 같습니다.
116
+
117
+ 1. 한글 및 영어, 특수문자, 그리고 이모지(🥳)까지!
118
+
119
+ 정규표현식을 통해 한글, 영어, 특수문자를 포함해 Emoji까지 학습 대상에 포함했습니다.
120
+
121
+ 한편, 한글 범위를 `ㄱ-ㅎ가-힣` 으로 지정해 `ㄱ-힣` 내의 한자를 제외했습니다.
122
+
123
+ 2. 댓글 내 중복 문자열 축약
124
+
125
+ `ㅋㅋㅋㅋㅋ`와 같이 중복된 글자를 `ㅋㅋ`와 같은 것으로 합쳤습니다.
126
+
127
+ 3. Cased Model
128
+
129
+ KcBERT는 영문에 대해서는 대소문자를 유지하는 Cased model입니다.
130
+
131
+ 4. 글자 단위 10글자 이하 제거
132
+
133
+ 10글자 미만의 텍스트는 단일 단어로 이뤄진 경우가 많아 해당 부분을 제외했습니다.
134
+
135
+ 5. 중복 제거
136
+
137
+ 중복적으로 쓰인 댓글을 제거하기 위해 완전히 일치하는 중복 댓글을 하나로 합쳤습니다.
138
+
139
+ 6. `OOO` 제거
140
+
141
+ 네이버 댓글의 경우, 비속어는 자체 필터링을 통해 `OOO` 로 표시합니다. 이 부분을 공백으로 제거하였습니다.
142
+
143
+ 아래 명령어로 pip로 설치한 뒤, 아래 clean함수로 클리닝을 하면 Downstream task에서 보다 성능이 좋아집니다. (`[UNK]` 감소)
144
+
145
+ ```bash
146
+ pip install soynlp emoji
147
+ ```
148
+
149
+ 아래 `clean` 함수를 Text data에 사용해주세요.
150
+
151
+ ```python
152
+ import re
153
+ import emoji
154
+ from soynlp.normalizer import repeat_normalize
155
+
156
+ emojis = ''.join(emoji.UNICODE_EMOJI.keys())
157
+ pattern = re.compile(f'[^ .,?!/@$%~%·∼()\x00-\x7Fㄱ-ㅣ가-힣{emojis}]+')
158
+ url_pattern = re.compile(
159
+ r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)')
160
+
161
+ import re
162
+ import emoji
163
+ from soynlp.normalizer import repeat_normalize
164
+
165
+ pattern = re.compile(f'[^ .,?!/@$%~%·∼()\x00-\x7Fㄱ-ㅣ가-힣]+')
166
+ url_pattern = re.compile(
167
+ r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)')
168
+
169
+ def clean(x):
170
+ x = pattern.sub(' ', x)
171
+ x = emoji.replace_emoji(x, replace='') #emoji 삭제
172
+ x = url_pattern.sub('', x)
173
+ x = x.strip()
174
+ x = repeat_normalize(x, num_repeats=2)
175
+ return x
176
+ ```
177
+
178
+ > 💡 Finetune Score에서는 위 `clean` 함수를 적용하지 않았습니다.
179
+
180
+ ### Cleaned Data
181
+
182
+ - KcBERT 외 추가 데이터는 정리 후 공개 예정입니다.
183
+
184
+
185
+ ## Tokenizer, Model Train
186
+
187
+ Tokenizer는 Huggingface의 [Tokenizers](https://github.com/huggingface/tokenizers) 라이브러리를 통해 학습을 진행했습니다.
188
+
189
+ 그 중 `BertWordPieceTokenizer` 를 이용해 학습을 진행했고, Vocab Size는 `30000`으로 진행했습니다.
190
+
191
+ Tokenizer를 학습하는 것에는 전체 데이터를 통해 학습을 진행했고, 모델의 General Downstream task에 대응하기 위해 KoELECTRA에서 사용한 Vocab을 겹치지 않는 부분을 추가로 넣어주었습니다. (실제로 두 모델이 겹치는 부분은 약 5000토큰이었습니다.)
192
+
193
+ TPU `v3-8` 을 이용해 약 10일 학습을 진행했고, 현재 Huggingface에 공개된 모델은 848k step을 학습한 모델 weight가 업로드 되어있습니다.
194
+
195
+ (100k step별 Checkpoint를 통해 성능 평가를 진행하였습니다. 해당 부분은 `KcBERT-finetune` repo를 참고해주세요.)
196
+
197
+ 모델 학습 Loss는 Step에 따라 ���기 100-200k 사이에 급격히 Loss가 줄어들다 학습 종료까지도 지속적으로 loss가 감소하는 것을 볼 수 있습니다.
198
+
199
+ ![KcELECTRA-base Pretrain Loss](https://cdn.jsdelivr.net/gh/beomi/blog-img@master/2021/04/07/image-20210407201231133.png)
200
+
201
+ ### KcELECTRA Pretrain Step별 Downstream task 성능 비교
202
+
203
+ > 💡 아래 표는 전체 ckpt가 아닌 일부에 대해서만 테스트를 진행한 결과입니다.
204
+
205
+ ![KcELECTRA Pretrain Step별 Downstream task 성능 비교](https://cdn.jsdelivr.net/gh/beomi/blog-img@master/2021/04/07/image-20210407215557039.png)
206
+
207
+ - 위와 같이 KcBERT-base, KcBERT-large 대비 **모든 데이터셋에 대해** KcELECTRA-base가 더 높은 성능을 보입니다.
208
+ - KcELECTRA pretrain에서도 Train step이 늘어감에 따라 점진적으로 성능이 향상되는 것을 볼 수 있습니다.
209
+
210
+ ## 인용표기/Citation
211
+
212
+ KcELECTRA를 인용하실 때는 아래 양식을 통해 인용해주세요.
213
+
214
+ ```
215
+ @misc{lee2021kcelectra,
216
+ author = {Junbum Lee},
217
+ title = {KcELECTRA: Korean comments ELECTRA},
218
+ year = {2021},
219
+ publisher = {GitHub},
220
+ journal = {GitHub repository},
221
+ howpublished = {\url{https://github.com/Beomi/KcELECTRA}}
222
+ }
223
+ ```
224
+
225
+ 논문을 통한 사용 외에는 MIT 라이센스를 표기해주세요. ☺️
226
+
227
+ ## Acknowledgement
228
+
229
+ KcELECTRA Model을 학습하는 GCP/TPU 환경은 [TFRC](https://www.tensorflow.org/tfrc?hl=ko) 프로그램의 지원을 받았습니다.
230
+
231
+ 모델 학습 과정에서 많은 조언을 주신 [Monologg](https://github.com/monologg/) 님 감사합니다 :)
232
+
233
+ ## Reference
234
+
235
+ ### Github Repos
236
+
237
+ - [KcBERT by Beomi](https://github.com/Beomi/KcBERT)
238
+ - [BERT by Google](https://github.com/google-research/bert)
239
+ - [KoBERT by SKT](https://github.com/SKTBrain/KoBERT)
240
+ - [KoELECTRA by Monologg](https://github.com/monologg/KoELECTRA/)
241
+ - [Transformers by Huggingface](https://github.com/huggingface/transformers)
242
+ - [Tokenizers by Hugginface](https://github.com/huggingface/tokenizers)
243
+ - [ELECTRA train code by KLUE](https://github.com/KLUE-benchmark/KLUE-ELECTRA)
244
+
245
+ ### Blogs
246
+
247
+ - [Monologg님의 KoELECTRA 학습기](https://monologg.kr/categories/NLP/ELECTRA/)
248
+ - [Colab에서 TPU로 BERT 처음부터 학습시키기 - Tensorflow/Google ver.](https://beomi.github.io/2020/02/26/Train-BERT-from-scratch-on-colab-TPU-Tensorflow-ver/)