6월, 2017의 게시물 표시

FPN

이미지
🌑 Introduction 아래 그림 (a)와 같이 기존의 객체검출은 hand-engineered features를 이용하여 image pyramids를 구성하고 각 pyramid에서 feature를 계산한 후 모든 위치에서 객체 유무를 판단하는 방법이였다. 이와 다르게 최근의 convNet 기반의 객체검출은 convNet 자체가 scale에 강인하기도 하지만 빠른 객체검출을 위해 1개의 scale만을 이용하였다. 하지만 convNet 의 scale 변화에 강인성에는 한계가 있고 최근의 ImageNet, COCO detection challenges 에서는 featurized image pyramid 기반으로 multi-scale testing을 이용하였다. 이러한 방법들은 수행시간이 오래 걸리며, 학습 시에도 많은 메모리가 필요하다는 단점이 있다. 이를 해결하기 위한 방법으로 그림 (c)와 같은 pyramidal feature hierarchy가 있다. 이 network는 서로 다른 scale을 갖는 feature map을 이용하여 검출에 사용한다. 대표적인 방법이 SSD 이다. SSD 는 계산한 feature map을 다시 사용하여 higher layer를 계속 생성한다. SSD는 이미 계산한 higher-resolution maps을 검출할 때 1회만 사용한다. 하지만 이러한 feature map은 작은 객체에 대한 정보를 많이 담고 있으므로 1회가 아닌 여러 번 사용하는 것이 작은 객체를 검출할 때 도움이 된다. 이 논문의 목표는 convNet’s feature hierarchy의 pyramidal shape을 활용하는데 어떻게 활용하느냐 바로 모든 scale 에서 강력한 semantics을 갖도록 하겠다는 것이다. 그럼 어떻게 그 목적을 달성하느냐? è Network 구조는 top-down과 lateral connection(측면에서 연결)에 있다. 그림 (d)와 같은 구조를 통해 semantic이 강한 low-resolution(widt

CNN을 NLP에 적용하기

이미지
CNN을 2-D의 image pixels에 적용하는 대신 matrix로 표현된 sentences 나 documents 에 적용한다. 아래 그림과 같이 matrix의 row는 sentences의 word를 word2vec을 이용해서 word embeddings으로 표현되는 vector이다. 아래에서 사용되는 CNN filters의 width는 input vector의 width와 동일한 크기를 갖는다. CNN filter의 height는 다양한 크기를 갖는다 아래 그림에서는 2, 3, 4 의 3 종류의 height 크기가 있다. 아래 그림에서 7x5 matrix의 input vector에 4x5 filter를 적용하면 pad=0, slide=1 이라면 4x1 vector가 output map size 이다. 또한, 7x5 matrix의 input vector에 2x5 filter를 적용하면 6x1 vector가 output map size 이다. 6개의 output map에 1-max pooling을 하면 각각의 결과들은 1개의 값으로 pooling되는데 이를 concat 하면 총 6-D vector가 된다. 아래와 같이 N class로 분류하는 application으로는 sentiment Analysis, Spam Detection or Topic Categorization 등이 있다.

Convolutional Sequence to Sequence Learning

이미지
초기에 https://arxiv.org/pdf/1408.5882.pdf 와 같이 CNN을 NLP에 적용한 방법들이 있었다. 이러한 방법들은 단순하게 CNN을 NLP에 적용해서 성능이 그다지 좋지 않았고 한 동안 CNN을 이용한 방법들은 주류에서 멀어지게 되었고 RNN을 반드시 사용해야 하는 것 같이 생각되었다. 구글의 NMT를 보면 Bidirectional RNNs과 attention mechanism, LSTM은 반드시 사용되어야 하는 것처럼 생각되었다. 내가 NLP 전공자는 아니지만 attention 이라는게 처음 나온 이유가 Encoder-decoder(seq-to-seq)에서 모든 encoder의 정보가 하나의 vector로 정리되고 이를 통해 decoder를 할 경우 input sentence가 길어질 수록 메모리의 제약이 온다는 점이다. 또한 학습도 어려워진다. 이를 해결하고자 attention model이 제안되었다. 나는 CNN만 주로 다루다 보니 NLP에 CNN을 적용하는거 자체가 성능에 제약이 있는 것이 아니라 잘 적용하면 성능은 올라갈 것이라고 생각이 들었다. 딥러닝을 각 도메인에 적용했을 때 어떻게 적용할 지 몰라 단순하게 mnist처럼 다루는 방식은 성능이 기존 보다 높지 않지만 각 도메인에 적절하게 네트워크를 구성하면 결국에는 성능이 올라가는 것이 요 몇 년 사이에 일어나는 일이다. 그래서 attention을 처음 읽었을 때 각 sequence의 정보를 저렇게 어차피 저장해서 attention을 이용해서 사용할 것이라면 CNN으로 충분히 대체 가능하다는 생각이 들었다. 오늘 살펴 본 논문처럼 기존보다 성능도 좋은 결과물이 나왔다는 것이 상당히 고무적이다. Pixel RNN이 결국 pixel CNN++ 로 발전하는 것처럼 이제 NLP도 CNN이 대세인 시대가 오는 것인가. 그런 경우 정말 네트워크만 잘 설계하면 NLP도 나 같은 영상처리만 딥러닝으로 한 사람도 할 수 있는 시대가 오는 것 아닌가라는 ...(도메인 간의 벽이

Applying deep learning to real-world problems

이미지
아래 글을 읽고 정리해 본다. https://medium.com/merantix/applying-deep-learning-to-real-world-problems-ba2d86ac5837 딥러닝을 실제 문제에 적용하기 위해 다음 3가지를 주의해야 한다. 1. the value of pre-training 양질의 데이타를 얻는 것은 비용이 많이 든다. 그러므로 pre-training을 이용해서 최소한의 비용으로 최대한의 성능을 얻어보자. 먼저, 유사한 domain의 대량의 데이타에서 모델을 학습한다. 예를 들어 ImageNet과 같은 1000개 class를 분류하는 데이타에서 모델을 학습하는 것이다. 이 후 내가 해결해야 하는 문제 즉 나는 10개의 class만 분류한다면 내가 갖고 있는 dataset에 위에서 학습한 모델을 fine-tunning 하는 것이다. 그렇다면 pre-training을 하기 위해 데이타를 어떻게 수집할까? ◆ Sources of data for pre-training 1> Pre-trained models 이미 다양한 곳(학교, 회사)에서 미리 학습된 모델을 제공한다. 2> Public datasets 아래와 같이 공개한 데이타가 많다. http://www.cvpapers.com/datasets.html https://github.com/caesar0301/awesome-public-datasets https://archive.ics.uci.edu/ml/datasets.html 3> Data crawling 웹사이트에서 데이타를 크롤링하는 방법이 있다. ▶ Weakly labeled data 데이타를 대량으로 사람의 annotation 없이 수집하다보면 잘 못된 label 이 발생한다. 하지만 소수의 데이타로 분류를 하는 것보다 잘 못 annotation 되더라도 대량의 데이타를 이용하는 것이 성능 향상에 더 도움이 된다. 2. caveats of real-world la

Show and Tell: Lessons learned from the 2015 MSCOCO Image Captioning Challenge

이미지
Image captioning 즉 image를 text로 변환하는 작업은 매우 흥미로운 일이다. 이것은 이미지 인식과 자연어처리의 조합이다. Image captioning은 이미지에 대해 정확하게 기술하는 captions을 생성한다. 지금까지 최신의 Image Captioning 기법은 구글에서 제안한 방법이다. 아래 사이트에 자세한 정보가 나와 있다. https://research.googleblog.com/2016/09/show-and-tell-image-captioning-open.html 사실 이것은 2014년 11월에 발표한 유명한 논문인 "Show and Tell: A Neural Image Caption Generator" 을 개선 시킨 것이다. 이 논문은 아래와 같이 수식으로 표현할 수 있다. 사진 I 와 잘 학습된 파라미터 W가 주어지면 설명문 S 즉 caption을 생성하는 것이다. 이것을 그림으로 표현하면 아래와 같다. 즉 image가 입력되면 googlenet 등과 같이 image의 특징을 잘 추출하는 model을 적용하여 특징 벡터를 뽑고 이를 LSTM의 최초 입력으로 집어 넣는다. 그러면 다음 step에서는 S0와 이전 step에서 생성한 C(-1), h(-1)이 LSTM의 입력이 되어 가장 확률이 높은 단어 S1이 선택되고 이는 다음 step(1)의 입력 단어가 된다. 이런 과정은 문장의 끝을 나타내는 token이 나타날 때까지 계속된다. 그렇다면 BeanSearch는 무엇일까? BeamSearch는 아래 그림과 같이 확률이 높은 k 개의 단어를 기억하고 있는 것이다. 그리고 다음 step에서 이 k개의 단어를 입력으로 넣는다. 실제 논문에서는 k 개를 beam of size라고 하며 20개를 사용했다. k = 1인 경우는 2 BLEU만큼의 성능 저하가 있었다. 자 기본적인 Show and Tell은 끝났고 2016년 9월에 발표된 구글의 논문은 위에서