Gradiend Descent 로 부터 Adam까지 optimizer 정리

BASE

GD(Gradient Descent)

  • 전체 데이터를 관찰하고 파라미터 업데이터(속도 느려, 메모리 잡아먹어)SGD(Stochastic Gradient Descent) - vanila
  • Mini batch 적용
  • 자주 파라미터 업데이트 되지 속도 빨라 메모리 효율적으로 사용돼
  • 하지만 여전히 local minima 에 빠짐

개선 갈래 1 (관성을 이용하자. 직전 step의 변화량을 사용

Momentum

  • 관성(탄력)을 이용하는 방법
    • "이전에 이렇게 많이 움직였는데... 갑자기 급브레이크를? 자연스럽지 않잖아!" 자연스럽게 바꾸자!
  • 이전 스텝에서 계산된 그래디언트를 일정비율로 (현재 스텝의 그래디언트에) 더해줌
  • /수식을 보면 저 이전스텝적용 비율대로 step이 진행됨에 따라 decay 되는 것을 확인할 수 있음/

Nesterov Accelerated Gradient (NAG)

  • 이전에 계산된 위치에 관성을 먼저 적용시켜불고 거기서 로스를 구해서 그래디언트를 구해부러! (모멘텀 텀은 그대로 존재)

개선 갈래 2 (parameter 마다 step을 다르게 주자..., Adaptive Learning Rate)

  • param1은 미니마에 거의 도착했고 param2는 아직 도착 못햇으면 param1는 작은 LR를 적용하고 param2는 큰 LR를 적용해야 하는거 아냐? 라는 생각으로 부터 적용

Adaptive Gradient (Adagrad)

  • Learning rate 에 상수가 아닌 분모에 변화를 줘서 파라미터마다 다르게 적용할 수 있도록 함 (상수가 아닌 파라미터갯수만큼의 벡터를 사용)
  • Gt 라는 놈에 각 파라미터가 얼마나 많이 변해왔는지를 계산해서 넣어둠 (그 값의 루트값을 분모로 취해줌. 즉, 많이 변한놈은 lr을 작게 만듦)
  • (궁금증) 초기값이 애초에 너무 어긋나 있으면...?? 그럼 실제로 열심히 찾아가야 하는데 많이 움직였다고 브레이크를 걸어??? 음...

RMSProp

  • Adagrad 에서 분모가 무한발산해서 학습률이 엄청 작아지는 문제를 개선하기 위해 (위에서의 궁금증 부분) 일정 비율로 Gt 값이 업데이트 되도록 개선하였음
  • Gt = r*Gt-1 + (1-r)(파라미터미분값제곱합)

AdaDelta

  • 얘는... learning_rate의 분자까지 계산식이 들어가는데...(즉 상수인 lr이 사용되지 않음, 그래서 하이퍼파라미터에 없음)
  • 근데 생각보다 잘 동작하지 않는다고 함

개선 갈래를 합치차 (Momentum 사용 + Adaptive Learning Rate 사용)

Adaptive Moment Estimation (ADAM)

  • Mt, Vt 를 사용해서 계산하는데...
  • Mt
    • Gradient 에 Momentum을 적용한 항
  • Vt
    • Gradient 에 Adaptive LR 를 적용한 항 (Gradient 의 제곱을 사용)
  • 첫 스텝에 너무 큰 스텝을 밟지 않게 하기 위한 Mt, Vt 를 변경하는 계산을 더해줌
  • 최종 수식은 Mt를 모멘텀 적용된 변화량으로 사용, Vt를 Learning Rate 계산용으로 사용하여 최종 업데이트가 진행됨.

TO-DO

  • NAdam, RAdam, AdamW 등 더 개선된 놈들이 실제 practical 한 지..의 관점으로 더 살펴보기

Ref

'기계학습' 카테고리의 다른 글

GCN (Graph Convolution Network)  (0) 2021.12.29
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

구조

  • 노드 피쳐 메트릭스
  • 인접행렬
    • 노드피쳐 메트릭스 , filter weights, 인접행렬을 곱하면 message passing 이 된다.
  • Inception
    • message passing을 몇 번 반복하느냐에 따라 receptive field의 크기를 조절할 수 있다.
  • Readout Layer
    • 그래프의 노드 순서와 상관없이 학습되도록 하는 방법 중 하나
    • MLP로 연결해버림
  • skip connection
    • resNet 처럼 연결하면 된다
    • gated skip connection을 적용할수도 있다. (두 입력을 어느정도의 비율로 적용할지 비율을 계산하여 반영하는 방법)
  • Attention
    • 인접 노드들의 정보를 합칠때 Attention 기법을 이용하여 weighted sum 형태로 구현 가능하다

 

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

Overview

  • Text classification 모델을 생성한다.
  • 간단하게 Character embedding layer를 두고 문서의 character embedding 평균 백터를 구하여 Fully Connected Layer를 두어 (2개층) 최종적으로 binary classification을 수행하도록 한다.

Network Module 구현하기

  1. nn.Module을 상속받아 클래스를 생성한다.
  2. init 함수에 네트워크에서 필요한 Layer들(주로 pytorch에서 기본 제공되는 Layer들을 정의함. 물론 사용자 정의 모듈도 정의 가능함)
  3. forward 함수 안에 모듈의 input 부터 output까지 네트워크의 흐름을 구현해준다.

이번 구현에서 필요한 pytorch 기본 제공 모듈 살펴보기

  1. torch.nn.EmbeddingBag
    • Text 관련 네트워크에서 사용하는 Embedding Layer에 평균/합계/최대값 등 특정 계산값을 구하는 부분이 추가된 모듈이다.
    • 이번 예시에서는 EmbeddingBag을 사용하나. 실제로는 주로 Embedding 레이어를 더 많이 사용한다.
  2. torch.nn.Linear
    • 기본적인 Fully Connedted Layer 이다.
    • (주의사항) activation func 는 포함되지 않으며 input * weight 까지만 수행한다.
  3. torch.nn.BatchNorm1d
    • 1차원 batch normalization layer 이다.
    • batch normalization 은 다른 포스팅 혹은 유투브 강의를 살펴보면 된다. "Internal Covariate Shift(ICS)" 라는 term만 잘 이해하면 되긴 한다. (다만,  batch normalization 의 성능향상 효과는 ICS 와는 상관이 없었다능... 결국 loss function의 landscape가 smoothing 되는 효과 때문이라능... 그게 요 논문)
    • Andrew Ng 강의를 보면 batch normalization은 regularization 기능도 한다고 한다. 하지만 주 목적은 학습을 빠르게 하는 것이다.
    • (추가) 비교적 최신(최신이라기엔 시간이 많이 흘렀지만..)인 transformers 같은 network 상에서 사용하는 normalization을 보면 Batch normalization 보다 Layer Normalization을 사용하는 것을 볼 수 있다. 요 차이는 normalization을 수행하는 차원은 B(batch)차원으로 하느냐 L(layer) 차원으로 하느냐 차이이다. Batch Normalization이 아래와 같은 한계점 때문에 Layer Normalization 을 더 많이 사용한다고 하니 참고하면 좋을 듯 하다.
      • Batch Normalization 은 Batch 사이즈를 적절히 조절했을 때 제대로 동작한다. 따라서 메모리를 상당히 많이 사용하는 복잡한 모델을 돌릴때 상대적으로 batch 사이즈를 크게 가져갈 수 없는 경우가 발생하고 이에 따라 Batch Normalization 이 제대로 동작하지 않을 수 있다.(Batch 가 너무 커도 잘 동작하지 않는다고 한다.) 반면 Layer 단위로 Normalization을 진행할 경우 이러한 Batch size에 영향을 받지 않는다. (자세한 사항은 batch / layer normalization을 설명한 다른 포스트들을 찾아보면 좋다)
      • (참고사항)배치 정규화를 사용할 경우 학습되는 파라미터 중 bias 부분에 해당하는 베타(학습되는 값)가 있는데 이러한 부분이 기존 fc 에서 별도로 추가해서 사용할 수 있는 bias 와 역할이 동일하다. 따라서 배치 정규화를 사용하는 경우 굳이 바이어스를 사용할 필요가 없다고 한다.
  4. torch.nn.Relu
    • activation layer의 한 종류. 다른 activation 함수들도 살펴 보면 좋다.
    • Relu 의 출현은 'vanishing gradient' 와 관계가 있으니 관련 내용도 찾아보면 좋다.
  5. torch.nn.Dropout
    • Overfitting 방지를 위한 layer 이다.
    • 기본 동작은 일정 확률로 뉴런을 죽이거나 혹은 살린다. DL 프레임워크마다 파라미터로 넘겨주는 값이 때로는 죽이는 확률일때도 있고 살리는 확률일때도 있다. 따라서 사용중인 프레임워크의 기본 파라미터의 의미를 잘 알고 사용하는 것이 좋다. pytorch는 죽이는 확률이 기본 값으로 들어간다.
    • (참고사항) 사실 대부분 high level API를 사용하기 때문에 Dropout을 직접 구현할일이 없지만. 직접 구현시에 단순히 일정 확률로 죽이는것으로 끝나는 것이 아니라 backpropagation에서 죽었던 뉴런에 대한 처리를 따로 해주어야 하기 때문에 추가적인 구현이 필요하다. 이 부분은 Andrew Ng 교수님의 강의에 대략적으로 설명이 되어있다.

(유의사항1) BatchNorm, Activation, Dropout 의 적절한 위치는??

  • Fully Connected Layer를 구축할 때 사용되는 모듈들의 순서를 어떻게 해야할 지 모르겠는 경우가 있다. 특히 위 제목에 있는 것들...
  • 다행히 이러한 궁금증에 대한 대답은 여러 군데에서 찾을 수 있다. 여기에서도.
  • 결론은 FC - BATCH - ACTIVATION - DROPOUT 순이다.
  • 자세한 이유는 구글링...

(유의사항2) Softmax Layer의 부재... 왜?

  • 이전 포스팅에서 대답이 되었지만....
  • 구현상의 이슈로 인해 (exp 함수로 인한 overflow 문제) Softmax 와 log 함수를 합한 log_softmax 함수를 주로 사용하며
  • NLL_loss 를 사용하면 log_softmax를 모듈의 마지막 레이어에 넣어주어야 하며,
  • CrossEntropyLoss 를 사용하려면 log_softmax layer를 생략해야한다.

구현 예시

class MeanCharEmbeddingClsf(nn.Module):
    def __init__(self, vocab_size, char_emb_dim, hidden_dim1, hidden_dim2, class_cnt):
        '''
        define network structure
        :param vocab_size:
        :param char_emb_dim:
        '''
        super(MeanCharEmbeddingClsf, self).__init__()

        self.char_emb_bag = nn.EmbeddingBag(num_embeddings=vocab_size, embedding_dim=char_emb_dim, mode="mean")

        self.fc1 = nn.Linear(char_emb_dim, hidden_dim1)
        self.fc2 = nn.Linear(hidden_dim1, hidden_dim2)
        self.layer_out = nn.Linear(hidden_dim2, class_cnt)

        self.batchnorm1 = nn.BatchNorm1d(hidden_dim1)
        self.batchnorm2 = nn.BatchNorm1d(hidden_dim2)

        self.do = nn.Dropout(0.2)
        self.relu = nn.ReLU()

    def forward(self, char_seqs):
        # char_seqs (B, CSL, CED)
        mean_vec = self.char_emb_bag(char_seqs)

        h1 = self.fc1(mean_vec)
        h1 = self.batchnorm1(h1)
        h1 = self.relu(h1)
        h1 = self.do(h1)

        h2 = self.fc2(h1)
        h2 = self.batchnorm2(h2)
        h2 = self.relu(h2)
        h2 = self.do(h2)

        out = self.layer_out(h2)
        return out

'pytorch' 카테고리의 다른 글

CrossEntropyLoss in pytorch (feat. log_softmax, nll_loss)  (0) 2020.09.30
01. DataSet  (0) 2020.09.28

이론과 구현이 다르다?

  • logistic regression의 이론 공부를 마치고 나면 아래와 같이 생각이 정리된다.
    • output layer에 softmax layer를 두어 weited sum 의 output을 prob 형태로 변경한다.
    • prob 형태로 나온 output에 대해 실제 정답분포와의 cross entropy loss 를 사용하여 loss를 계산한다.
  • 근데... pytorch로 구현할때는...
    • output layer 에 softmax를 취하지 않고 바로 CrossEntropyLoss 를 적용한다...

왜?

  • pytorch 의 CrossEntropyLoss 안에 Softmax (정확하게는 log_softmax) 가 구현되어 있기 때문이다.

왜 이렇게 구현이..???

  • softmax 함수를 취할때 exp 함수를 적용하며, cross entropy를 계산할때 다시 log를 취한다....
  • 그럼 원래대로 돌아온다...
  • 다시 원복될거 두번할 필요도 없을 뿐더러... 더 중요한 이유가 있는데,
  • softmax를 취하기 위해 exp 함수를 적용하면서 overflow 문제가 발생하는 것이 더 주된 이유이다.
    • exp 함수를 취할때 overflow가 발생하면 log를 취하더라도 이미 값은 유실된 후이다(..... 는 뻘소리였나...)
  • 그래서 softmax가 따로 구현되어있지 않는 것임. 자세한 건 여기를 참조
  • 다 집어치우고, softmax + CrossEntropyLoss 를 합쳐서 구현하면... forward / backward 구현이 개 쉬워진다. 더하기 빼기로 구현되어버림... (당연히 계산량이 엄청 줄어듦...) 이제 진짜 이유. (공신력 있는 자료를 참고하는 습관을 갖자...)

'pytorch' 카테고리의 다른 글

02. model(network) 구현하기  (0) 2020.10.03
01. DataSet  (0) 2020.09.28

Dataset

Dataset 사용 전 참고사항

  • CASE1. 훈련 데이터셋을 메모리에 다 들고 있을 정도로 여유가 있는 경우. (아래의 예제를 참조, Dataframe으로 데이터셋 전체를 들고 있는 방법)
  • CASE2. 메모리에 다 들고 있을 수 없을 만큼 데이터의 양이 많은 경우.
    • IterableDataset을 참조

Custom Dataset 생성 방법

  1. torch.util.data.Dataset을 상속
  2. len 함수 구현
    • 전체 데이터셋의 크기를 반환하도록 구현
  3. init 함수 구현
    • Datapoint의 변환메소드나 사전 / Tokenizer 등의 초기화 작업을 진행
  4. getitem 함수 구현
    • 객체[i] 형태처럼 index를 통해 특정 원소를 참조하기 위해 구현하는 함수
  5. iter 함수 구현 (IterableDataset 에서 필요)
    • for 문과 같은 iteration 에서 어떤 순서로 원소를 가져오는 지 구현하는 부분

Transformers 사용하기

  • 일반적으로 Dataset 의 초기화 과정에서는 원본 형태의 Datapoint를 들고 있으며, 이 Datapoint를 torch 의 네트워크에 주입해 주기 위해 Tensor 형태로 바꾸기 위한 일련의 작업 과정이 필요하다. 보통 이러한 데이터 변환을 담당하는 Class 들을 구현한 후 이들의 객체를 리스트로 담아 Dataset의 초기화 인자로 넘겨주어 Dataset에서 리턴하는 모든 datapoint가 동일하게 변환과정을 거치도록 구현한다.

  • 텍스트의 경우, tokenizing / padding / index변환 등의 변환 과정이 구현된 객체가 transformers 인자로 전달된다.

  • 일반적으로 transformer의 마지막 step은 torch 의 Tensor로 변환하는 과정이다.

    class ToIdxTransform(object):
      def __init__(self, vocab_path, max_seq_length = 30, unk_tok = '[UNK]', pad_tok = '[PAD]'):
          with codecs.open(vocab_path, 'r', 'utf-8') as fin:
              chars = [i.strip('\n') for i in fin.readlines() if i.strip()]
    
          self.chars = chars
          self.idx_map = dict(zip(self.chars, range(len(self.chars))))
          self.max_seq_length = max_seq_length
    
          self.unk_tok = unk_tok
          self.pad_tok = pad_tok
    
          assert self.unk_tok in self.idx_map
          assert self.pad_tok in self.idx_map
    
          self.unk_idx = self.idx_map[self.unk_tok]
          self.pad_idx = self.idx_map[self.pad_tok]
    
      def __call__(self, dp):
          d = dp['document']
          char_ids = [self.idx_map.get(c, self.unk_idx) for c in d][:self.max_seq_length]
          char_ids.extend([self.pad_idx] * (self.max_seq_length - len(char_ids)))
    
          dp['document'] = char_ids
          return dp

Custom Dataset 의 구현 예시

class CharacterSequenceDataset(Dataset):
    def __init__(self, df, transformers=None):
        self.df = df
        self.labels = df['label'].map(lambda x : int(x)).to_list()
        self.titles = df['title'].map(lambda x : str(x)).to_list()
        self.transformers = transformers

        assert len(self.labels) == len(self.titles)

    def __len__(self):
        return len(self.labels)

    def __getitem__(self, idx):
        # Data point
        dp = OrderedDict( {
            'label' : self.labels[idx],
            'title' : self.titles[idx]
        })

        if self.transformers is not None:
            for transformer in self.transformers:
                dp = transformer(dp)

        return dp

'pytorch' 카테고리의 다른 글

02. model(network) 구현하기  (0) 2020.10.03
CrossEntropyLoss in pytorch (feat. log_softmax, nll_loss)  (0) 2020.09.30

Overview

  • 이 포스팅은 마크다운 문법 실습용 포스팅임.
  • 여기 를 참조하여 작성하였음.
  • 아래와 같은 효과를 어떻게 작성하는지 궁금하다면 위 링크를 참조.

제목 단계별 글씨 크기 예시입니다.

제목1

제목 2

제목 3

제목 4

제목 5
제목 6

이것은 강조하기 예시 입니다.

이탤릭체
두껍게

취소하기

밑줄긋기


이것은 리스트 형태의 항목 나열 예시 입니다.

  1. 첫번째
  2. 두번째
    • 설명1
    • 설명2
  3. 세번째
    1. 세번째_첫번째
    2. 세번째_두번째
  4. 네번째
  • 번호 붙이기 끝

링크 삽입하기 예시 입니다.

NAVER

꺽쇠를 사용하여 링크로 변환합니다. http://www.naver.com

이렇게 아래 참조링크도 사용이 가능합니다. 참조1 로 이동.


이미지 삽입하기 예시 입니다.

  • 쿠팡 이미지 입니다.
    쿠팡로고

코드삽입 예시 입니다. (파이썬 코드 예시)

import codecs
def main():
    print('hello world!')
if __name__ == "__main__":
    main()

표삽입 예시 입니다.

======

이름 나이
dan 37 192.32
novister 33 203.1
woney 31 184.92

의미 기본값
static 유형(기준) 없음 / 배치 불가능 static
relative 요소 자신을 기준으로 배치
absolute 위치 상 부모(조상)요소를 기준으로 배치
fixed 브라우저 창을 기준으로 배치

줄바꿈 예시입니다.

동해물과
백두산이
마르고
닳도록
하느님이
보우하사

우리나라만세

"붕어가 되어가는 나를 위해..."

 

추천 강의

 

StatQuest 의 XGBoost 강의 시리즈 [링크]

 

XGBoost 의 기본 개념부터 사용되는 수식의 유도까지 모두 다룬다. BAM~~ (Part4 까지 볼것.)

 

이전 시리즈인  Gradient Boost (Part1~3) 도 볼 것을 추천함.

 

 

기억해야할 Terms

 

  • Initial Prediction : 학습, 예측 모든 과정에서 사용되는 초기 예측값 (보통 레이블의 통계정보를 활용하여 설정)

  • Similarity : 해당 노드에 속한 sample들의 유사성 점수 (정규화 상수 reg_lambda 가 사용됨)

    • lambda 의 역할

      • Similarity 의 점수를 낮춘다.

      • Leaf 에 있는 sample의 수가 적을 수록 Similarity 점수를 더욱 많이 낮춘다.  (Gain이 작아짐)

      • 결국, pruning이 더 잘 일어나도록 만든다.

      • 더욱 일반화된 트리가 형성되도록 한다.

  • Gain : 트리가 분기함에 따라 높아진 Similarity 의 값 (분가를 시킬 변수를 결정할때 사용됨.)

  • 양자화(Quantization, feat.binning) : continuous 한 값을 갖는 변수의 모든 영역을 분기의 기준으로 삼을 수 없기에 영역을 지정하고 binning을 통해 진행함.

  • Missing Value 의 처리 - 완벽한 feature를 가지고 있지 않은 샘플에 대한 예측 및 고도화 전략

  • Pruning (Post prunning) : 일반화를 위한 pruning. (pruning 상수 gamma가 사용됨)

    • Pruning은 Gain 값을 기준으로 진행됨.

    • gamma가 0이라고 pruning 이 진행되지 않는 것은 아님.

  • Learning Rate (eta)

 

 

학습

 

매번의 Single Tree 학습은 아래와 같은 순서를 반복한다.

  1. 모든 Residual 계산 (이전 트리까지의 output 값을 이용)

  2. Build Tree (Gain, Similarity, lambda, max_depth 이용)

  3. Prune Tree (Gain, gamma 이용)

  4. 최종 output 값 계산 (learning_rate, lamba, initial_prediction 이용)

 

학습의 종료

  • n_estimator 만큼 트리를 반복적으로 생성 

  • 매 트리 생성 시 마다 dev 셋의 성능을 측정.

  • early_stopping_rounds 동안 성능의 향상이 없다면 신규 Tree 생성을 종료

 

수식 (Regression) - classification은 다름

 

Similarity = (Sum of Residuals)^2 / (# of Residuals)

 

Output = (Sum of Residuals)^2 / (# of Residuals)

 

Gain = LeftGain + RightGain - ParentGain

 

 

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
GCN (Graph Convolution Network)  (0) 2021.12.29
Gradient Boost for classification (binary)  (0) 2020.08.20
K-means Algorithm  (0) 2015.11.25

STEP1. Initial prediction 설정 (log odds & logistic 함수사용, feat. sigmoid)

  • 왜 logistic regression에서 sigmoid 함수를 사용하는가?

  • odds 란 무엇이며, sigmoid 함수와 어떤 관계가 있는가?

  • 이 링크에 모든 것이 설명되어 있다.

  • 위 링크의 내용을 이해하면 주어진 데이터로부터 아래의 초기 prediction 값을 계산하는 과정을 이해할 수 있음.

  • initial prediction = logit(log(p(Positive) / p(Negative)))

STEP2. Residuals 계산

  • prediction 결과와 실제 값과의 차이를 구하는 것.

  • 다음에 생성될 tree의 목표 예측 값으로 사용됨.

  • 첫 트리에서는 pos/neg sample 의 residual 값이 각각 같은 값으로 설정되지만 두번째 트리부터는 달라짐.

STEP3. Tree 생성

Tree 의 Leaf node 에서의 probability 값 계산 (** 주의 ** regression용 트리에서의 수식은 다름)

  1. 먼저 output 값을 구한다. 여기서 output 값은 log(odds) 값을 구할때 사용되는 값임.

    • output = Sum(all residuals on the leaf node) / Sum ((이전트리 예측치) * (1-이전트리 예측치))
  2. log(odds) 값 구하기

    • log(odds) = init_prob + learning_rate * (output value) (트리가 하나인 경우, 두개인 경우. 뒷 항이 트리의 갯수만큼 붙음
  3. probability 값 구하기 (최종 예측값)

    • logistic function을 이용하여 log(odds) 값을 probability로 변경함. 관련 내용은 위의 링크에서 확인 가능함.

변수 선택의 기준

- Gradient Boos 의 설명에서 생략 되어 있고 XG boost 에서만 설명이 나와있는데 같을 것으로 생각됨. XG Boost 포스팅에서 설명

'기계학습' 카테고리의 다른 글

Optimizer 종류  (0) 2022.01.01
GCN (Graph Convolution Network)  (0) 2021.12.29
[정리노트] XGBoost 이해하기 (Regression)  (0) 2020.08.25
K-means Algorithm  (0) 2015.11.25

https://spark.apache.org/docs/latest/quick-start.html

 

Quick Start - Spark 2.4.5 Documentation

Quick Start This tutorial provides a quick introduction to using Spark. We will first introduce the API through Spark’s interactive shell (in Python or Scala), then show how to write applications in Java, Scala, and Python. To follow along with this guide,

spark.apache.org

위 페이지에 있는 'Quick Start' tutorial을 따라하다가 생긴 이슈 사항에 대해 정리.

  •  설치
    • 내 환경 : MacOS 
    • 설치목록
      • Spark
      • sbt
        • sbt란?
          • simple build tool의 약자로 그냥 일반 빌드 툴인듯 하나 scala 를 빌드하기 위한 기능이 잘 제공되고 있는듯하다. 
        • 이 튜토리얼에서 .scala 파일을 빌드하기 위해 이 툴을 사용하므로 일단 설치.
    • 설치팁
      • spark, sbt 의 tgz 파일을 각각 다운 받는다. 
      • 해당 파일의 압축을 푼다. ( tar -xvzf ".tgz 파일명")
      • SPARK_HOME, SBT_HOME 을 환경변수로 등록하고
      • PATH 환경변수에 SPARK_HOME/bin SBT_HOME/bin을 추가한다.
        • .bach_profile 에 설정하는 방법을 인터넷에서 찾아볼것.
      • 참고) brew 나 이런걸로 설치되면 나중에 지우고 할때 개운치 못한 느낌이 들어서 홈디렉토리 아래 util 폴더를 생성하고 그 아래 모든 설치를 진행함... 나중에 지우기 편하게...
      • JDK는 이미 설치되어 있었음.
  • scala에 대해 알게된 것들 (함수등의 기능)
    • map
    • flatMap
    • collect
    • reduce
    • count
    • java 와 동일한 import 방식 (* ==> _  로 바뀐것만 빼고)
    • cache (뭐 내가 쓸랑가 싶지만...)
    • groupByKey  
      • groupByKey(identity) 에서 identity가 도통 뭔지.... 위에 선언도 안되어 있고 예약어 느낌도 아님.
  • Spark Application 생성 
    • object 가 main 함수를 가져야함.
    • SparkSession 을 명시적으로 생성해줘야함 (spark-shell에서는 이미 지정되어있음.)
  • SBT build
    • build.sbt 파일 필요 (폴더 최상위 위치)
    • src/main/scala 폴더 아래에 스칼라 파일 위치 (sbt에서 요구하는 폴더구조가 있는 듯.)
    • build.sbt 작성시, scala 와 spark 버젼을 넣어줘야 하는데 실제 설치된것과 다른 버젼을 적었더니 실패함.
      • spark 버젼 확인 : sc.version
      • scala 버젼 확인 : util.Properties.versionString

Next

  • spark 2.0부터 RDD 기반 방식이 아닌 DataSet 기반 동작을 추천함. 성능도 더 좋다고 함. 
  • RDD  guideline은 건너띄고 DataSet 가이드로 고고!
  • Aho-corasick
    • 다중패턴매칭 알고리즘이다. 
      • 예를들어 미리 구축해 놓은 사전(혹은 복수개의 검색어 리스트)에 아래의 단어가 저장되어 있다고 하자 (이하 사전단어라 칭함.)
        • no
        • now
        • here
        • where
        • nowhere
      • 사용자의 입력이 'dreamisnowhere' 가 들어왔을 때 substr 으로 발견되는 모든 사전단어를 찾아내야 하는 일을 생각해보자. 
      • 단순하게 생각하면 string class 에서 제공하는 substr을 이용하여 찾을 수도 있다. 
        • 사전단어 중에서 max 길이를 알아내고 가능한 모든 경우를 사전에 있는지 찾아보는거다
        • 물론 이렇게 하면 된다. 하지만 시간이 오래걸리고 매우 똑똑하지 못한 방법이다. 
      • 이러한 경우의 문제를 똑똑하게 풀어내기 위해 제안된 여러 다중패턴매칭 알고리즘 중 대표격인 알고리즘이다.
    • 구조
      • Trie 구조 + FailFunction Table
      • 구조는 위와 같이 단순하다.
    • 알고리즘 설명
      • 아래 블로그에 알고리즘에 대해 자세히 설명되어 있다. (다시 설명하는 번거로움 보다는 잘 설명된 곳을 알려드리는 편이 나을 듯 하여...)
    • 동작 시뮬레이션
  • Aho-Corasick 라이브러리
    • 언어 c++
    • 특징
      • 기본 Aho-Corasick 구현부는 다른 라이브러리와 동일함.
      • Dump 기능 - Aho-corasick 을 구성한 후 구성된 자료구조를 binary db 파일로 생성이 가능하다. 
      • 다중검색 기능 - 위의 시뮬레이션 사이트에서 검색을 위애 옮겨다니는 노드 포인터를 복수개로 늘린 버젼을 제공한다.
        • 이와 같은 기능은 다양한 인식 시스템에서의 후처리 업무를 하고 있는 필자의 경우 wfst로 구성된 복잡함 graph 내에서 사전단어를 검색하는 경우 유용하게 사용된다. 
    • 빌드환경
      • Windows visual studio 10.0'


+ Recent posts