cleanUrl: 'paper/character-level-cnn'
1. ๋
ผ๋ฌธ ์ ์ ๋ฐฐ๊ฒฝ2. Introduction3. Character-level Convolutional Networks3.1 Key Modules3.3 Model design3.4 Data Augmentation using Thesaurus4. Comparison Models4.1 Traditional Method(๊ธฐ์กด์ ์ ํต์ ์ธ ์ ํ๋ชจ๋ธ) : ๋ชจ๋ ๋คํญ ๋ก์ง์คํฑ ํ๊ท๋ถ์ ์ฌ์ฉ4.2 Deep Learning Methods : ๋ชจ๋ word2vec์ ์ด์ฉํ์ฌ ๋จ์ด๋ฅผ ์๋ฒ ๋ฉํจ(embedding size : 300)5. Large-scale Datasets and Results5.1 Dataset5.2 Result6. Discussion7. Conclusion and Outlook8. Code
1. ๋ ผ๋ฌธ ์ ์ ๋ฐฐ๊ฒฝ
๊ณผ๊ฑฐ ํ
์คํธ ๋ถ๋ฅ๋ฅผ ์ํด CNN์ ํ์ฉํ ๋ชจ๋ธ๋ค์ ์
๋ ฅ๊ฐ์ ์ต์๋จ์๋ก ๋จ์ด(embedded word vector)๋ฅผ ์ฌ์ฉํ์ผ๋ฉฐ, ๋ณดํต word2vec ์๋ฒ ๋ฉ๋ ๋จ์ด ๋ฒกํฐ๋ค, TFIDF ์ ๋ณด, ํน์ n-gram ์ ๋ณด๋ค์ ์ทจํฉํ bag of word์ด ์ฃผ๋ฅผ ์ด๋ฃจ์์ต๋๋ค.
๋ฐ๋ฉด ๋ณธ ๋
ผ๋ฌธ์ ๊ธฐ์กด ๋ชจ๋ธ๋ค์ ์ ๊ทผ๋ฐฉ์์ด์๋ ๋จ์ด๋ณด๋ค ๋ rawํ ์ ๋ณด์ธ ๋ฌธ์์ ์ฃผ๋ชฉํฉ๋๋ค. ์ด๋ ํ
์คํธ ๋ถ๋ฅ๋ฅผ ์ํด ๋ฌธ์ ๋จ์๋ฅผ ConvNet์ ์ต์ด๋ก ์ ์ฉ์์ผฐ๋ค๋ ๋ฐ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ํ ๋ฌธ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ทผ๋ณธ์ ์ธ ์ธ์ด ๊ตฌ์กฐ์ ํน์ง์ ๋ฝ์๋ด๊ณ ์ํ ์ ์ด ๋งค์ฐ ์ธ์๊น์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ ํ ๋ด์ฉ์ ๋ด๊ณ ์๋์ง ์์ธํ ์ดํด๋ณด๊ณ ํจ๊ป ๊ณต์ ํ๊ณ ์ ํด๋น ๋
ผ๋ฌธ์ ์ ์ ํ์์ต๋๋ค.
ย
2. Introduction
ํ
์คํธ ๋ถ๋ฅ๋ ์์ฐ์ด ์ฒ๋ฆฌ์ ๋ํ ๊ณ ์ ์ ์ฃผ์ ์
๋๋ค. ํ์ฌ๊น์ง์ ๋ชจ๋ ํ
์คํธ ๋ถ๋ฅ ๊ธฐ์ ๋ค์ ๋จ์ด ์์ค์ ๊ดํ ๊ฒ์ด๋ฉฐ, ๊ทธ ์ค ๋ช๋ช ์ ๋ ฌ๋ ๋จ์ด ์กฐํฉ(์. n-grams)์ ๊ฐ๋จํ ํต๊ณ๋ ์ผ๋ฐ์ ์ผ๋ก ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ฐํํฉ๋๋ค.
๋ฐ๋ฉด ๋ง์ ์ฐ๊ตฌ์๋ค์ CNN์ด ์์ฑ ์ธ์๊ณผ ๊ฐ์ raw signal๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ธฐ ์ ์ฉํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ณธ ๋
ผ๋ฌธ์์๋ ๋ฌธ์ ์์ค์ raw signal๋ก ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด 1D-CNN์ ์ ์ฉํ๋ ๋ฒ์ ์ฐ๊ตฌํฉ๋๋ค. ๋ํ ๋๊ท๋ชจ์ ๋ฐ์ดํฐ์
์ ํ์๋ก ํ๋ CNN์ ํน์ฑ์ ์ฌ๋ฌ ๋ฐ์ดํฐ์
์ ๊ตฌ์ถํ์ต๋๋ค. ํ์ง๋ง CNN์ ๋จ์ด์ ๋ํ ์ง์์(ํต์ฌ ๋๋ ์๋ฏธ๊ตฌ์กฐ๋ฅผ ํฌํจ) ํ์๋ก ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ์ฉ์ดํฉ๋๋ค. ๋ํ ์ด๋ ๊ฒ ๋ฌธ์ ๊ธฐ๋ฐ์ผ๋ก ํ์ต๋ ๋ชจ๋ธ์ ์กฐ๊ธ์ ์์ ์ผ๋ก๋ ์ฌ๋ฌ ์ธ์ด์ ์ ์ฉ๋ ์ ์๊ณ , ์ฒ ์ ์ค๋ฅ๋ ์ด๋ชจํฐ์ฝ๋ ์์ฐ์ค๋ฝ๊ฒ ์ ํ์ต์ํฌ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
ย
3. Character-level Convolutional Networks
3.1 Key Modules
๋ชจ๋ธ์ ์ฃผ๋ ๊ตฌ์ฑ์ ๋จ์ํ 1D Convolution๋ง ๊ณ์ฐํ๋ ์๊ฐ์ Conv. module์
๋๋ค.
์ด์ฐ input function ์ ์ด์ฐ kernel function ์ ๊ฐ์ ํฉ๋๋ค.
๋ค์ ๋งํ๋ฉด, input function ๋ ์ค์ ๊ณต๊ฐ ๋ด ์์๋ก ์ ์๋๋ฉฐ, (kernel function) ๋ ์ค์๊ณต๊ฐ ๋ด ์์๋ก ์ ์๋ฉ๋๋ค.
stride ๋ฅผ ๊ฐ๋ ์ ์ Convolution ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์๋ฉ๋๋ค.
- Stride : ์ ๋ ฅ๋ฐ์ดํฐ์ ํํฐ๋ฅผ ์ ์ฉํ ๋ ๊ฐ๊ฒฉ์ ์กฐ์ ํ๋ ๊ฒ, ์ฆ ํํฐ๊ฐ ์ด๋ํ ๊ฐ๊ฒฉ์๋ฏธ.
ex) Stride = 1์ธ ํฉ์ฑ๊ณฑ
๋จ, ์ด ๋ ๋ก, ์คํ์
์์์
๋๋ค.
- ์คํ์ ์์ : ๋์ผ ์ค๋ธ์ ํธ ์์์ ์ค๋ธ์ ํธ ์ฒ์๋ถํฐ ์ฃผ์ด์ง ์์๋ ์ง์ ๊น์ง์ ๋ณ์์ฐจ๋ฅผ ๋ํ๋ด๋ ์ ์ํ.
ย
ย
Vision์์ ์ ํต์ ์ธ Convolution Net๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ณธ ๋ชจ๋์ input ์ output ์ ์งํฉ์์ ๊ฐ์ค์น(weights)๋ผ๊ณ ๋ถ๋ฆฌ๋ kernel function ( and )์ ์งํฉ์ ๋ํด์ ๋งค๊ฐ๋ณ์ํ ๋ฉ๋๋ค.
: input feature
: output feature
: input feature size
: output feature size
๋ฐ๋ผ์, output ๋ ์ ์ Convolution์ ์ ๋ํด ํฉํ์ฌ ์ป์ด์ง๋๋ค.
ย
๋ ๊น์ ๋ชจ๋ธ์ ํ๋ จ์ํค๋๋ฐ ๋์์ด ๋ ํต์ฌ ๋ชจ๋ ์ค ํ๋๋ ์๊ฐ max-pooling์
๋๋ค. ์ปดํจํฐ ๋น์ ์์ ์ฌ์ฉ๋๋ max-pooling์ 1-D ๋ฒ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. (2์ฐจ์ โ 1์ฐจ์์ผ๋ก ์ฐจ์ ์ถ์)
input function ๊ฐ ์ฃผ์ด์ก์ ๋, ์ max-pooling function ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋ฉ๋๋ค.
๋จ, ์ด ๋ ๋ก, ์คํ์
์์์
๋๋ค.
๋ฐ๋ก ์ด pooling module์ 6๊ฐ์ layer๋ณด๋ค ๋ ๊น์ ConvNets๋ฅผ ํ์ต๊ฐ๋ฅํ๊ฒ ๋ง๋ค์์ต๋๋ค.
๋ชจ๋ธ์ ๋น์ ํ์ฑ์ thresholding function ์ด๋ฉฐ, ์ด๊ฒ์ Convolutional layer๋ฅผ Rectified Linear Units(ReLUs)์ ๋น์ทํ๊ฒ ๋ง๋ญ๋๋ค.
์ฌ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ฏธ๋๋ฐฐ์น ์ฌ์ด์ฆ๊ฐ 128์ธ ํ๋ฅ ์ ๊ฒฝ์ฌํ๊ฐ๋ฒ(SGD)์ด๋ฉฐ, momentum 0.9, initial step size๋ 0.01์ ์ฌ์ฉํ์์ต๋๋ค.
๊ฐ epoch๋ ํด๋์ค ์ ์ฒด์์ ๊ท ์ผํ๊ฒ ์ํ๋ง ๋์ด ๊ณ ์ ๋ ์ ๋งํผ ๋ฌด์์๋ก train sample์ ์ทจํฉ๋๋ค.
์ด ๋ชจ๋ธ์ ์ธ์ฝ๋ฉ๋ ๋ฌธ์ ์ํ์ค๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์๋ค์
๋๋ค. ์ฌ๊ธฐ์ ์ธ์ฝ๋ฉ์ ๊ฐ์ ์ํ๋ฒณ์ ๋ํด one-hot ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ๊ฐ ์
๋ ฅ์ ๊ณ ์ ๊ธธ์ด๊ฐ ์ธ ์ฐจ์์ ๋ฒกํฐ๊ฐ ๋๋ฉฐ, ์ ์ฒด ์ํ์ค๋ ์ฐจ์์ ํ๋ ฌ๋ก ํํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ธธ์ด๊ฐ ์ ์ด๊ณผํ๋ ๋ชจ๋ ๋ฌธ์๋ ๋ฌด์๋๋ฉฐ, ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ํฌํจํ์ฌ ์ํ๋ฒณ์ด ์๋ ๋ชจ๋ ๋ฌธ์๋ ๋ชจ๋ ์ ๋ก ๋ฒกํฐ๋ก ์์ํ๋ฉ๋๋ค.
ย
์ด ๋ชจ๋ธ์์๋ ์ํ๋ฒณ์ ์ด 70๊ฐ์ ๋ฌธ์๋ก ์ ์ํ์ต๋๋ค. 26๊ฐ์ ์์ด ๋ฌธ์, 10๊ฐ์ ์ซ์, ๊ทธ๋ฆฌ๊ณ 33๊ฐ์ ํน์๋ฌธ์์ ์ค ๋ด๋ฆผ ๋ฌธ์๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ ์๋ฌธ์๋ก ์
๋ ฅ๋ฐ๋๋ก ํ์์ต๋๋ค. ์ ์ฒด ์ํ๋ฒณ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ย
3.3 Model design
์ต์ข
์ ์ผ๋ก 2๊ฐ์ ConvNet์ ์ค๊ณํ์ต๋๋ค. ํ๋๋ ๋ง์ feature๋ฅผ ๊ฐ์ง๋ ConvNet์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ์ ์ feature๋ฅผ ๊ฐ์ง๋ ConvNet์ผ๋ก feature ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ๋์ผํฉ๋๋ค. ์ด๋ค์ 6๊ฐ์ Convolutional layer์ 3๊ฐ์ fully-connected layer๋ก ์ด๋ฃจ์ด์ง ์ด 9๊ฐ์ layer๋ก ํํ๋ฉ๋๋ค.
๋์ฑ ์ธ๋ถ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์
๋ ฅ์ feature ์๋ 70์ด๋ฉฐ ์
๋ ฅ ๊ธธ์ด๋ 1014์
๋๋ค. ์ด๋ ์์ ์ธ๊ธํ one-hot ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ 70์ฐจ์์ ๋ฒกํฐ๊ฐ ๋๋ ๊ฒ์ด๋ฉฐ, 1014๊ฐ์ ๋ฌธ์๊น์ง๋ง ์
๋ ฅ์ผ๋ก ๋ฐ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ณธ ๋
ผ๋ฌธ์ ๋ฐ๋ฅด๋ฉด ์ด ์ ๋ ๊ธธ์ด์ ๋ฌธ์ ์ํ์ค๋ผ๋ฉด ํ
์คํธ์ ๋๋ถ๋ถ์ ์ฃผ์ ๋ด์ฉ์ ์ก์๋ผ ์ ์๋ค๊ณ ํฉ๋๋ค.
์ ๊ทํ๋ฅผ ์ํ์ฌ 3๊ฐ์ fully-connected layer ์ฌ์ด์ dropout์ 2๋ฒ ์ฌ์ฉํ์ผ๋ฉฐ, ํ๋ฅ ์ 0.5๋ก ์ค์ ํ์ต๋๋ค. ๊ฐ์ค์น ์ด๊ธฐํ๋ ๊ฐ์ฐ์์ ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋๋ก ํ๊ณ ๋ถํฌ์ ํ๊ท ๊ณผ ๋ถ์ฐ์ ํฐ ๋ชจ๋ธ์ ๋ํด์๋ (0, 0.02)๋ก ์์ ๋ชจ๋ธ์ (0, 0.05)๋ก ์ค์ ํ์ต๋๋ค.
ย
์ ํ๋ ์์ ์ธ๊ธํ๋ฏ์ด feature ์์ ๋ฐ๋ฅธ ํฌ๊ณ ์์ ๋ชจ๋ธ์ ์ธ๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ํฐ ๋ชจ๋ธ์ feature ์๋ฅผ 1024, ์์ ๋ชจ๋ธ์ 256์ผ๋ก ์ค์ ํ์ฌ convolution์ ์งํํ์ต๋๋ค. ์ฆ ๋ค๋ฅธ ํฌ๊ธฐ์ ํํฐ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ดํดํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก stride๋ฅผ 1๋ก ํ๊ณ Pooling๊ณผ์ ์์ overlap๋๋ ๋ถ๋ถ์ด ์๊ฒ ํ์์ต๋๋ค.
ย
3.4 Data Augmentation using Thesaurus
๋ฐ์ดํฐ ์ฆ๊ฐ์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์์ ์ผ๋ฐํ ์ ๋๋ฅผ ํฅ์์ํฌ ์ ์๋ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค. ํ์ง๋ง ํ
์คํธ์ ๊ฒฝ์ฐ ๋ฌธ์์ ์์๊ฐ ๋งค์ฐ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง๋ ์์ฑ ์ธ์์์์ฒ๋ผ ๋ฐ์ดํฐ ๋ณํ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋๋ฆฌ๋ ๊ฒ์ ๋ฐ๋์งํ์ง ์์ต๋๋ค. ์ฌ์ค ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ๋์ด ์ง์ ๋ฌธ์ฅ์ ๋ฐ๊ฟ์ฐ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ด๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ ์๋ก ๋น์ฉ์ด ๋ง์ด ์์๋๋ฏ๋ก ๋ณธ ๋
ผ๋ฌธ์์๋ ๋จ์ด๋ ๊ตฌ๋ฅผ ์ ์์ด๋ก ๋์ฒด์ํค๋ ๋ฐฉ์์ ํํ์ต๋๋ค(English Thesaurus ์ฌ์ฉ).
๋จผ์ ์ฃผ์ด์ง ํ
์คํธ์์ ๋์ฒด ๊ฐ๋ฅํ ๋ชจ๋ ๋จ์ด๋ฅผ ์ถ์ถํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ~ ๋ฅผ ํตํด ์ํ๋ง ๋ ๊ฐ์ ๋จ์ด๋ฅผ ์ ์์ด๋ก ๋์ฒดํ์์ผ๋ฉฐ, ๋์ผํ ๊ธฐํ๋ถํฌ์ธ ~ ๋ก๋ถํฐ ์ํ๋ง๋ s๋ก๋ถํฐ ์ ์์ด์ index๋ฅผ ๊ฒฐ์ ํ์ต๋๋ค. ๊ธฐํ๋ถํฌ๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉ๋๋ ์๋ฏธ์ ๋ฉ์ด์ง์๋ก ์ ์์ด๊ฐ ์ ํ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์ ๊ฒ์ด๋ผ๊ณ ์ถ์ธกํ ์ ์์ ๊ฒ์
๋๋ค.
ex) [์ฌ์, ์๋
, ์ฒ๋
, ์์ค๋ง]์ผ ๋,
์ฌ์์ ์ ์์ด๋ก ์ ํ๋ ํ๋ฅ : ์๋
> ์ฒ๋
> ์์ค๋ง
4. Comparison Models
Character CNN ๋ชจ๋ธ์ ์ ํต์ ์ธ ์ ํ๋ชจ๋ธ๊ณผ ๋น ์ ํ์ ๋ฅ๋ฌ๋๋ชจ๋ธ๋ก ๋น๊ตํ ๊ฒฐ๊ณผ์ ๋ํ ๋ด์ฉ์
๋๋ค.
4.1 Traditional Method(๊ธฐ์กด์ ์ ํต์ ์ธ ์ ํ๋ชจ๋ธ) : ๋ชจ๋ ๋คํญ ๋ก์ง์คํฑ ํ๊ท๋ถ์ ์ฌ์ฉ
- Bag-of-words and its TFIDF : bag-of-words ๋ชจ๋ธ์ ๊ฐ ๋ฐ์ดํฐ์ ์ ๋น๋๊ฐ ๋์ 50000๊ฐ ๋จ์ด๋ค๋ก ๊ตฌ์ฑ๋จ
- Bag of Words : ๋จ์ด๋ค์ ์์๋ ์ ํ ๊ณ ๋ คํ์ง ์๊ณ , ๋จ์ด๋ค์ ์ถํ ๋น๋(frequency)์๋ง ์ง์คํ๋ ํ ์คํธ ๋ฐ์ดํฐ์ ์์นํ ํํ ๋ฐฉ๋ฒ
TFIDF
[TFIDF ๊ณต์]
TF : ๊ฐ ๋ฌธ์์์์ ๊ฐ ๋จ์ด์ ๋ฑ์ฅ ๋น๋
DF : ํน์ ๋จ์ด t๊ฐ ๋ฑ์ฅํ ๋ฌธ์์ ์
IDF : DF์ ๋ฐ๋น๋ก
ย
1) ํด๋น ๋ฌธ์์์ ๋ํ๋ ํ์๊ฐ ๋ง์์๋ก(TF)
2) ๋ค๋ฅธ ๋ฌธ์์์ ๋ํ๋ ํ์๊ฐ ์ ์์๋ก(IDF)
โ ํด๋น ๋ฌธ์๋ฅผ ๋ํํ๋ ํค์๋
โ ๊ทธ์ ๋จ์ด์ ๋น๋๋ง์ ์ธ๋ bag-of-words์๋ ๋ค๋ฆ!
- Bag-of-ngrams and its TFIDF : 5-grams๊น์ง์ n-gram์์ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ ์์ 500,000๊ฐ๋ก ๊ตฌ์ฑ๋จ, TFIDF๋ ๋์ผํ ๊ณผ์
n-gram์ ๋ํ ์ดํด
- Bag-of-means on word embedding : word2vec์ ์ ์ฉํ ๊ฒ์ ๋ํด k-means์ ์ฌ์ฉํจ, ์ด๋ฅผ ํตํด ๋์จ ๋จ์ด๋ฅผ ํด๋ฌ์คํฐ๋ง ๋ ๋จ์ด๋ค์ ๋ํ ๋จ์ด๋ก ์ฌ์ฉํจ
embedding ์ฐจ์ : 300
*Word2vec์ ๋จ์ด์ ๋ฒกํฐํ : ์ฃผ๋ณ (context window)์ ๊ฐ์ ๋จ์ด๊ฐ ๋ํ๋๋ ๋จ์ด์ผ์๋ก ๋น์ทํ ๋ฒกํฐ๊ฐ์ ๊ฐ์
4.2 Deep Learning Methods : ๋ชจ๋ word2vec์ ์ด์ฉํ์ฌ ๋จ์ด๋ฅผ ์๋ฒ ๋ฉํจ(embedding size : 300)
- Word-based ConvNets
*์ฐ๋ฆฌ์ ๋ชจ๋ธ์ character ๊ธฐ๋ฐ์ด๊ณ , ์ฌ์ฉํ ๋น๊ต๊ตฐ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋จ์ด ๊ธฐ๋ฐ์
- LSTM(Long-short term memory)
ํ์ต ์ gradient clipping๊ณผ multinomial logistic regression์ ์ฌ์ฉํ์์
5. Large-scale Datasets and Results
CNN์ ๋ณดํต ํฐ ๋ฐ์ดํฐ์
์ ํจ๊ณผ์ ์ธ๋ฐ ํนํ ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ฒ๋ผ character๋จ์์ low-level์ raw features๋ค์ ๋์ฑ ํ์ํฉ๋๋ค. ํ์ง๋ง ๋๋ถ๋ถ์ ํ
์คํธ ๋ถ๋ฅ๋ฅผ ์ํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์์ผ๋ฏ๋ก ํ์๋ ๋ฐ์ดํฐ์
์ ๋ง๋ค์์ต๋๋ค.
5.1 Dataset
ย
- AGโs news corpus
- Sogou news corpus
- DBPedia ontology dataset
- Yelp reviews
- Yahoo! Answers dataset
- Amazon reviews
ย
5.2 Result
์์ ๋ฐ์ดํฐ์
์ผ๋ก ๋ชจ๋ธ๋ค์ ๋๋ฆฐ testing error(%)๋ฅผ ๋ํ๋ธ ํ์
๋๋ค. (๊ฐ์ด ์์์๋ก ์ข์ ๊ฒ)
good : ํ๋์, bad : ๋นจ๊ฐ์์ ํด๋น
Lg : large
Sm : small
w2v : word2vec
LK : lookup table
Th : thesaurus
6. Discussion
1) Character level ConvNet์ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค.
๋จ์ด ๋ง๊ณ ๋ character ๋จ์๋ก๋ ํ
์คํธ ๋ถ๋ฅ์ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด ๋ ์ ์์์ ๋ณด์ฌ์ค๋๋ค.
2) ๋ฐ์ดํฐ์
์ ํฌ๊ธฐ๋ traditionalํ ๋ชจ๋ธ๊ณผ ConvNets ๋ชจ๋ธ๋ค ์ฌ์ด์์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋ณด์
๋๋ค.
์์ ๋ฐ์ดํฐ์
โ ์ ํต์ ์ธ NLP ๋ชจ๋ธ์ด ์ฑ๋ฅ ์ฐ์
ํฐ ๋ฐ์ดํฐ์
โ ConvNets ๋ชจ๋ธ์ด ์ฑ๋ฅ ์ฐ์
โ ํ์ต์ ์ํด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ์๋กํ๋ CNN์ ํน์ฑ ๋๋ฌธ์
๋๋ค.
3) ConvNet์ ์ฌ์ฉ์๊ฐ ๋ง๋ ๋ฐ์ดํฐ์์ ์ข์ต๋๋ค โ real world์ ๋ ์ ํฉํ ๋ฐ์ดํฐ์์ ์๋ฏธํฉ๋๋ค.
(ํ์ง๋ง convnet์ด ์ ๋ง ์คํ๋ ์ด๋ชจํฐ์ฝ์ ๋ฌธ์๋ค์ ๊ฐํ์ง๋ ์คํ์ด ๋ ํ์ํ ์ํ๋ผ๊ณ ํฉ๋๋ค.)
4) ์ํ๋ฒณ์ ์ ํ์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๋ง์ด ๋ฌ๋ผ์ง๋๋ค.
๋๋ฌธ์๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ธ๋งํ์์ ๋ ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ์ต๋๋ค.
์ ์๋ค์ ๋, ์๋ฌธ์๊ฐ์ ์๋ฏธ์ฐจ์ด๊ฐ ์ค์ ๋ก ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์, ์๋ฌธ์๋ง ์ฌ์ฉํ์๋ regularization effect๋ฅผ ๊ฐ์ ธ์จ๋ค๊ณ ๋ถ์ํ์์ต๋๋ค.
5) task์ ๋ฐ๋ฅธ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์์์ ๋ณด์ฌ์ค๋๋ค.
๊ฐ์ฑ ๋ถ์๊ณผ ํ ํฝ๋ถ๋ฅ์ ๋ํ ๋๊ฐ์ง task์ ์ฑ๋ฅ์ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, ๋ณ๋ค๋ฅธ ์ฐจ์ด๊ฐ ์์์ต๋๋ค.
6) Word2Vec ๊ธฐ๋ฐ์ k-means ํด๋ฌ์คํฐ๋ง์ ์งํํ์ฌ ์๋ฒ ๋ฉํ์์ ๋, ๋ชจ๋ ๋ฐ์ดํฐ์
์ ๋ํด ์ฑ๋ฅ์ด ์ข์ง ๋ชปํ์์ต๋๋ค(text classification task์์)
๋ถ์ฐ ํํ์ ๋จ์ํ๊ฒ ํ์ฉํ์ฌ ์ญํจ๊ณผ๊ฐ ์๊ฒผ๋ค๊ณ ํฉ๋๋ค.
7) ๋ชจ๋ ๋ฐ์ดํฐ์
์ ์์ด ์ต์ ์ ๋ชจ๋ธ์ ์๋ค๋ ์ ์
๋๋ค.
๊ฒฐ๊ตญ, ์คํ์ ํตํด ๋ฐ์ดํฐ์
์ ๊ฐ์ฅ ์ ํฉํ ๋ชจ๋ธ์ ์ฐพ์์ผ ํฉ๋๋ค.
7. Conclusion and Outlook
์ด ๋
ผ๋ฌธ์ character-level์ convolutional networks๊ฐ text classification์์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์์์ ๋ณด์ฌ์ค๋๋ค. ํฐ ๋ฐ์ดํฐ์
์ ์ฌ์ฉํ๋ฉด์ ๋ง์ ์ ํต์ , ํน์ ๋ฅ๋ฌ๋ ๋ฐฉ๋ฒ๋ค๊ณผ character cnn ๋ชจ๋ธ์ ๋น๊ตํด๋ณด์์ ๋, ๋ฐ์ดํฐ์
์ ํฌ๊ธฐ ํน์ ์ด๋ค ์ํ๋ฒณ์ ์ฌ์ฉํ๋์ง ๋ฑ์ ๋ง์ ์์ธ๋ค๋ก ๋ชจ๋ธ์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ธฐ๋ ํ๋ค๋ ์ ์ด ์กด์ฌํฉ๋๋ค.
ย
+)
Word-based CNN๊ณผ ๋๋ถ์ด ๋ณธ ๋
ผ๋ฌธ์ Text Classification์ ์ํ Character level์ CNN ๋ชจ๋ธ์ ์ ์ํ๊ณ ์์ต๋๋ค. ํ์ฌ๋ ๋ณธ ๋
ผ๋ฌธ์ ๋ฐฉ๋ฒ์ด ๋ง์ด ์ฌ์ฉ๋์ง๋ ์์ง๋ง, ๋ฌธ์ ํน์ ๋ฌธ์ฅ ๋จ์๊ฐ ์๋๋ผ character ๋จ์๋ก๋ text classification์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด ์ธ์๊น์๋๊ฒ ๊ฐ์ต๋๋ค
ย
ย
8. Code
๋
ผ๋ฌธ์ ๋์๋ AGโs News dataset์ ์ด์ฉํด ํ์ต์ ์งํํ์์ต๋๋ค. ์ฝ๋๋ Colab์ผ๋ก ์งํํ์์ต๋๋ค.
ย
ย
0) Load Data
import numpy as np import pandas as pd from keras.preprocessing.text import Tokenizer from keras.preprocessing.sequence import pad_sequences from keras.layers import Input, Embedding, Activation, Flatten, Dense from keras.layers import Conv1D, MaxPooling1D, Dropout from keras.models import Model from google.colab import drive drive.mount('/content/drive') train_df=pd.read_csv('AG_news/train.csv') test_df=pd.read_csv('AG_news/test.csv') train_df.rename(columns={'Class Index':0,'Title':1,'Description':2},inplace=True) test_df.rename(columns={'Class Index':0,'Title':1,'Description':2},inplace=True) # concatenate column 1 and column 2 as one text for df in [train_df, test_df]: df[1] = df[1] + df[2] df = df.drop([2], axis=1)
ย
1) Preprocessing
- ํ ์คํธ ์๋ฌธ์ ๋ณ๊ฒฝ
train_texts = train_df[1].values train_texts = [s.lower() for s in train_texts] test_texts = test_df[1].values test_texts = [s.lower() for s in test_texts]
- Tokenizer
# Initialization tk=Tokenizer(num_words=None, char_level=True,oov_token='UNK') # Fitting tk.fit_on_texts(train_texts)
- Construct Vocab
# construct a new vocabulary alphabet = "abcdefghijklmnopqrstuvwxyz0123456789,;.!?:'\"/\\|_@#$%^&*~`+-=<>()[]{}" char_dict = {} for i, char in enumerate(alphabet): char_dict[char] = i + 1 # Use char_dict to replace the tk.word_index tk.word_index = char_dict.copy() # Add 'UNK' to the vocabulary tk.word_index[tk.oov_token] = max(char_dict.values()) + 1 # oov_token: Out Of Vocabulary (oov) -> ๋ชจ๋ฅด๋ ๋จ์ด๋ก ์ธํด ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ด ๊น๋ค๋ก์์ง๋ ์ํฉ ์ฒ๋ฆฌํจ # Convert string to index train_sequences = tk.texts_to_sequences(train_texts) test_texts = tk.texts_to_sequences(test_texts)
- Padding
train_data = pad_sequences(train_sequences, maxlen=1014, padding='post') test_data = pad_sequences(test_texts, maxlen=1014, padding='post') # Convert to numpy array train_data = np.array(train_data, dtype='float32') test_data = np.array(test_data, dtype='float32')
ย
- Get Label
train_classes = train_df[0].values train_class_list = [x - 1 for x in train_classes] test_classes = test_df[0].values test_class_list = [x - 1 for x in test_classes] from tensorflow.keras.utils import to_categorical train_classes = to_categorical(train_class_list) test_classes = to_categorical(test_class_list)
ย
2) Char CNN
- Parameter
input_size = 1014 vocab_size = len(tk.word_index) embedding_size = 69 conv_layers = [[256, 7, 3], [256, 7, 3], [256, 3, -1], [256, 3, -1], [256, 3, -1], [256, 3, 3]] fully_connected_layers = [1024, 1024] num_of_classes = 4 dropout_p = 0.5 optimizer = 'adam' loss = 'categorical_crossentropy'
- Embedding Layer
# Embedding weights embedding_weights = [] # (70, 69) embedding_weights.append(np.zeros(vocab_size)) # (0, 69) for char, i in tk.word_index.items(): # from index 1 to 69 onehot = np.zeros(vocab_size) onehot[i - 1] = 1 embedding_weights.append(onehot) embedding_weights = np.array(embedding_weights) print('Load') # Embedding layer Initialization embedding_layer = Embedding(vocab_size + 1, embedding_size, input_length=input_size, weights=[embedding_weights])
- Model Construction
# Input inputs = Input(shape=(input_size,), name='input', dtype='int64') # shape=(?, 1014) # Embedding x = embedding_layer(inputs) # Conv for filter_num, filter_size, pooling_size in conv_layers: x = Conv1D(filter_num, filter_size)(x) x = Activation('relu')(x) if pooling_size != -1: x = MaxPooling1D(pool_size=pooling_size)(x) # Final shape=(None, 34, 256) x = Flatten()(x) # (None, 8704) # Fully connected layers for dense_size in fully_connected_layers: x = Dense(dense_size, activation='relu')(x) # dense_size == 1024 x = Dropout(dropout_p)(x) # Output Layer predictions = Dense(num_of_classes, activation='softmax')(x) # Build model model = Model(inputs=inputs, outputs=predictions) model.compile(optimizer=optimizer, loss=loss, metrics=['accuracy']) # Adam, categorical_crossentropy model.summary()
ย
- Shuffle
indices = np.arange(train_data.shape[0]) np.random.shuffle(indices) x_train = train_data[indices] y_train = train_classes[indices] x_test = test_data y_test = test_classes
ย
- Training
learning_history=model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=128, epochs=10, verbose=2)
ย
- Result
import matplotlib.pyplot as plt hist = pd.DataFrame(learning_history.history) hist['epoch'] = learning_history.epoch hist.tail() plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.plot(hist['epoch'], hist['accuracy'], label = 'Train accuracy') plt.plot(hist['epoch'], hist['val_accuracy'], label = 'Val accuracy') plt.legend() plt.show()
ย
ย
*์ฐธ๊ณ ์๋ฃ
ย
ย
1์ฃผ์ฐจ ์ธ์คํ๊ทธ๋จ ํฌ์คํธ (1)