카테고리 없음

스파르타 AI-8기 TIL(10/24)-> 어텐션 메커니즘, 자연어 처리(NLP), ResNet, 다양한 이미지 처리 모델,

kimjunki-8 2024. 10. 24. 21:45
Attention Mechanism
간단히 말해 자연어 처리와 같은 분야에서 많이 사용되는 기법으로, 주어진 입력에서 어떤 부분이 더 중요한지를 파악해 그 부분에 더 큰 가중치를 부여합니다. 이를 통해 모델이 중요한 정보에 더 집중할 수 있게 해 줍니다.
어텐션 메커니즘에는 네가지 주요 요소들이 있습니다.
1. Query(쿼리) -> 집중하고자 하는 대상을 의미합니다. 어떤 정보를 찾거나, 어떤 연관성을 평가하기 위한 '질문'이라고 생각할 수 있습니다. 예를 들어, 문장에서 특정 단어가 다른 단어들과 어떤 관계가 있는지 확인하고자 할 때, 쿼리가 그 기준이 됩니다.

2. Key(키) -> 키는 쿼리와 비교하여 유사도를 계산할 대상입니다. 즉, 쿼리가 무엇을 찾고자 할 때, 그 찾는 기준이 되는 요소입니다. 쿼리와 키의 유사도를 계산해, 그에 따라 가중치를 결정합니다. 예를 들어, 문장에서 단어 "고양이"가 쿼리라면, 문장의 다른 단어들, 예를 들어 "물", "이불", "책상" 등이 키가 될 수 있습니다. 쿼리와 키의 유사도를 기반으로, 중요한 정보는 더 크게, 덜 중요한 정보는 작게 반환됩니다.

3. Value(벨류) -> 벨류는 실제로 반환되는 값입니다. 쿼리와 키를 통해 계산된 유사도(또는 가중치)에 따라, 벨류는 각 입력의 정보를 가중평균 형태로 반환합니다.

4. Sequence(시퀀스) -> 시퀀스는 입력 데이터의 전체 집합을 의미합니다. 예를 들어, 문장에서 여러 단어들이 시퀀스를 이룹니다. 이 시퀀스의 각 요소(단어들)는 각각 키와 벨류로 변환되어, 쿼리와 비교됩니다. 예를 들어 "고양이가 이불에서 잠을 잔다."라는 문장에서 모든 단어들이 하나의 시퀀스가 되며, 그 시퀀스 안의 단어들이 각각 키와 벨류로 변환되어 사용됩니다.

 

방식
1. 먼저 시퀀스의 각 요소에 대한 중요도를 계산해서 가중치를 부여하고, 어떤 부분에 더 집중할 수 있게, 또는 무시할 수 있게 합니다.

2. 여기서 Attension score를 계산하게 되는데, Query와 key간의 유사도를 측정하여, 중요도를 찾아냅니다. 보통 내적(dot product) 방식으로 계산됩니다.

3.계산된 Attention score는 Softmax 함수를 통해 확률 분포로 변환됩니다. Softmax는 각 score를 0과 1 사이의 값으로 변환하고, 이들의 합이 1이 되도록 만듭니다.

4. Attention Weights를 값 벡터와 곱하여 최종 출력 값을 얻습니다. 여기서 이 최종 출력은 원래 입력 시퀀스의 정보가 포함된 벡터입니다. 즉, Softmax를 통해 얻어진 가중치를 Value에 곱하여 최종 Attention 출력을 계산합니다.

다양한 Attention 유형
Scaled Dot-Product Attention: 위에서 설명한 기본적인 형태입니다. 쿼리와 키 간의 내적을 통해 Attention score를 계산하고, Softmax를 적용합니다.

Multi-Head Attention: 여러 개의 Attention 메커니즘을 병렬로 사용하여 다양한 표현을 학습합니다. 각 head는 서로 다른 쿼리, 키, 값을 사용하고, 최종 출력은 각 head의 출력을 합친 것입니다.

Self-Attention: 입력 시퀀스의 각 요소가 자기 자신 및 다른 요소와의 관계를 평가합니다. 이를 통해 문맥 정보를 포착할 수 있습니다.
예시를 들어보겠습니다."고양이가 이불 위에서 잠을 자고 있다."
쿼리: "고양이"
키: "이불", "잠", "자고 있다"
벨류: 각 단어의 정보(단어의 벡터 등)

쿼리 "고양이"가 키들과 비교되며, "이불"과 "잠"이 더 높은 가중치를 받을 수 있습니다. 이 정보들이 벨류로 변환되어 최종적인 정보로 전달됩니다.

자연어 처리 모델(NPL)
컴퓨터가 인간의 언어를 학습하고 이해하는 모델

기법
1. 워드 임베딩(Word Embedding) -> 단어를 벡터로 변환하여 의미적 관계를 포착합니다. 즉, 글자를 숫자로 표현한다는 의미입니다. 그런데 여기서, 비슷한 단어끼리 있어야, 숫자도 알아보기 편하게 규칙이 있을 것이기 때문에, 그 점을 유의해야 합니다. 워드 임베딩에도 기법이 따로 존재합니다. (벡터로 변환 하는 기법)
Word2Vec -> Word2Vec은 두 가지 모델(CBOW와 Skip-gram)을 사용하여 단어 벡터를 생성합니다.
1. CBOW (Continuous Bag of Words) : 주변 단어를 사용해 중심 단어를 예측합니다. 예를 들어, "The cat sits on the"라는 문장에서 "sits"를 예측하는 모델입니다. 이 방법은 문맥 정보를 활용하여 중심 단어를 학습합니다.
즉, 주변 단어들의 문맥을 보고 중간의 빈칸 채우기와 비슷합니다.

2. Skip-gram: 중심 단어를 사용해 주변 단어를 예측합니다. 예를 들어, "sits"라는 중심 단어를 주면 주변 단어(예: "The", "cat", "on", "the")를 예측합니다. 이 모델은 특히 드문 단어에 대한 임베딩을 잘 학습합니다. 이것은 CBOW와 다르게, 중심의 단어의 문맥을 보고 주변 빈칸을 채우기와 같습니다.

GloVe -> GloVe는 전체 문서에서 단어의 동시 발생 통계를 이용하여 임베딩을 생성합니다. 단어 간의 동시 발생 빈도를 기반으로 단어 벡터를 학습합니다. 다른 의미로 단어-단어-공기행렬을 사용해서 단어 백터를 학습합니다. 장점으로는, 전체 문맥을 고려하여 단어 간의 관계를 포착합니다. 그리고,
단어 간의 비율 관계를 잘 반영하여 의미적 유사성을 표현합니다.
즉, 전역적인 통계 정보를 학습해서, 단어간의 의미적 유사성을 보여준다입니다. 예를들어 여름과 덥다, 이 두 단어를 이용해 단어-단어-공기행렬을 사용해, 백터로 전환 후 학습한다 입니다.

시퀀스 모델링
시퀀스 모델링은 입력 데이터가 순차적이고, 시간적 또는 순서적 관계가 중요한 경우에 필요합니다.
각각의 입력 요소가 독립적이지 않고, 이전 또는 이후 데이터와의 관계를 통해 의미를 파악해야 하는 경우에 사용됩니다.

예시로 문장을 생각해보면, "나는 책을 읽는다."라는 문장에서 "나는"과 "읽는다"는 밀접한 관계를 가지고 있죠. 그래서 스퀀스 모델링은 이런 관계를 반영하는 모델을 만드는 것이 중요합니다.
스퀀스 모델링(Sequence Modeling)은 연속된 데이터를 다루는 모델링 방법입니다. 자연어 처리, 음성 인식, 시계열 데이터 분석 등에서 자주 사용됩니다.  여기서 "연속된 데이터"란 단어들의 나열, 시간의 흐름에 따른 값, 또는 순서가 중요한 모든 데이터 형태를 의미합니다. 스퀀스 모델링은 이런 연속적인 데이터에서 패턴을 학습하고 예측하는 데 사용됩니다.
원리
입력: 모델은 시퀀스 데이터(단어, 시간값 등)를 순차적으로 받아들입니다.
순환 구조: 이전 입력에서 나온 정보를 기억하고 다음 입력과 함께 처리합니다. 이를 통해 이전의 정보가 다음 출력에 영향을 미칠 수 있습니다.
출력: 시퀀스 데이터의 흐름을 바탕으로, 다음에 나올 값을 예측하거나 중요한 패턴을 학습합니다.
흐름
입력 데이터 준비: 시퀀스 데이터를 순차적으로 준비합니다. 예를 들어, 문장 데이터를 단어 벡터로 변환합니다.

모델 학습: 이전 입력을 기반으로 현재 또는 다음 출력값을 예측합니다. 여기서 RNN, LSTM, Transformer 등의 구조가 사용됩니다.

예측 또는 결과 도출: 학습된 모델을 통해 새로운 시퀀스 데이터에 대한 예측을 수행합니다. 예를 들어, 문장에서 다음 단어를 예측하거나, 주가 시계열 데이터에서 미래 가격을 예측하는 등의 작업을 합니다.

Transformer
Transformer의 핵심은 Self-Attention 메커니즘과 포지셔널 임베딩을 사용하여 단어 간의 관계를 학습하고, 병렬 처리를 통해 빠르고 효율적으로 학습을 진행하는 것입니다.
Transformer는 자연어 처리(NLP)뿐만 아니라 여러 다른 시퀀스 기반 작업에서 뛰어난 성능을 보여주고 있습니다. Transformer는 순차적 처리 없이도 병렬 처리가 가능한 모델로, 기존의 RNN과 LSTM 같은 순차적 모델들의 한계를 극복했습니다.
구조
Transformer는 인코더-디코더 구조를 기반으로 하며, 크게 두 가지 부분으로 나뉩니다:
인코더(Encoder): 입력 문장을 처리하는 부분. 입력 문장을 벡터로 변환하고 중요한 정보를 추출합니다. 대략적으로 문장을 인코딩하는 6개의 레이어로 구성되어 있으며, 각 레이어는 Self-Attention과 피드포워드 네트워크로 구성됩니다.
디코더(Decoder): 인코더에서 추출된 정보를 바탕으로 출력 문장을 생성합니다. 대략적으로 출력 문장을 생성하는 6개의 레이어로 구성되어 있으며, 각 레이어는 Masked Self-Attention, 인코더-디코더 Attention, 피드포워드 네트워크로 구성됩니다.

하지만 Transformer의 가장 큰 특징은 이 두 부분 모두에서 Self-Attention 메커니즘을 사용한다는 것입니다. 이 Self-Attention을 통해 각 단어가 문장 내에서 어떤 의미를 갖고 있는지 상호 참조하게 됩니다.
구성요소
1. 임베딩(Embedding) -> Transformer는 단어를 벡터로 변환하는 임베딩 층을 사용합니다. 임베딩은 각 단어를 고정된 차원의 벡터로 변환하는 역할을 하며, 이는 학습 가능한 단어 임베딩을 사용합니다.

2. 포지셔널 임베딩(Positional Embedding) -> Transformer는 RNN이나 LSTM처럼 순차적으로 데이터를 처리하지 않기 때문에 단어의 순서 정보를 학습할 수 없습니다. 이를 해결하기 위해 포지셔널 임베딩을 사용하여, 입력 문장에서 단어의 위치 정보를 벡터로 추가합니다. 포지셔널 임베딩은 사인과 코사인 함수를 사용하여 각 단어의 위치를 벡터로 변환하고, 이를 단어 임베딩에 더해줍니다.

3. Self-Attention 메커니즘 -> Transformer의 핵심은 Self-Attention 메커니즘입니다. Self-Attention은 문장 내에서 각 단어가 다른 단어들과의 관계를 계산하여, 해당 문맥에서 중요한 단어를 파악하는 역할을 합니다.

4. 멀티헤드 어텐션(Multi-Head Attention) -> Self-Attention을 여러 번 병렬로 수행하는 방식입니다. 각 헤드는 다른 부분의 정보를 학습할 수 있으며, 이를 통해 다양한 시점에서 단어 간의 관계를 학습할 수 있습니다.

멀티헤드 어텐션은 각 헤드가 다른 시각에서 단어 간의 상호작용을 분석하게 하여, 모델이 다양한 관계를 더 잘 이해하도록 돕습니다. 이를 통해 다양한 차원의 정보를 학습할 수 있게 됩니다.

5. 피드포워드 신경망(Feedforward Neural Network) -> Self-Attention 레이어 뒤에는 피드포워드 신경망이 있습니다. 이 신경망은 각 단어 벡터를 추가로 변환하는 역할을 합니다. 피드포워드 신경망은 두 개의 완전 연결 층(Fully Connected Layers)으로 구성됩니다:
첫 번째 층: ReLU 활성화 함수를 사용하는 층.
두 번째 층: 출력 크기를 입력 크기와 같게 맞춰주는 선형 변환 층.

6. 잔차 연결(Residual Connection) -> Transformer는 잔차 연결(Residual Connection)을 사용하여 각 레이어에서 입력과 출력을 더합니다. 이는 기울기 소실 문제를 해결하고, 모델 학습을 더 안정적으로 만들어줍니다.

7. 레이어 정규화(Layer Normalization) -> 잔차 연결을 거친 후에는 레이어 정규화가 적용됩니다. 이는 모델의 학습 속도를 높이고, 과적합을 방지하는 역할을 합니다.

8. Masked Self-Attention -> 디코더에서는 Masked Self-Attention을 사용합니다. Masked Self-Attention은 미래의 단어 정보를 차단하고, 이전 단어들만을 참고하여 현재 단어를 예측하는 방식입니다. 이 마스킹 과정은 다음 단어를 생성할 때 미래 단어가 모델에 영향을 주지 않도록 합니다.

9. 인코더-디코더 Attention -> 디코더의 각 레이어에서는 인코더의 출력과 Attention을 수행합니다. 이를 통해 인코더에서 얻은 정보를 바탕으로 다음 단어를 생성하는 데 필요한 정보를 파악할 수 있습니다

BERT
BERT는 기존 모델들과 달리 양방향으로 문맥을 이해합니다. BERT는 문장의 양쪽(contextual) 정보를 모두 사용해, 각 단어가 문장에서 양방향으로 주변 단어들과의 관계를 학습할 수 있게 합니다.
구성 요소
BERT는 기본적으로 Transformer의 인코더 부분만을 사용합니다. 즉, 디코더 없이 인코더만으로 구성된 모델입니다. Transformer와 마찬가지로 BERT는 Self-Attention 메커니즘을 사용해 각 단어가 문장 내의 다른 단어들과 상호작용할 수 있습니다.

1. 입력 임베딩 ->
BERT는 입력을 단어 임베딩과 포지셔널 임베딩을 통해 벡터로 변환합니다. 각 단어는 WordPiece 토큰화를 통해 단위 단어로 분리되고, 각 토큰은 벡터로 변환됩니다.
입력 벡터는 다음 세 가지 정보로 구성됩니다:
1. 단어 임베딩(Word Embedding): 각 토큰의 의미를 나타내는 벡터.
2. 포지셔널 임베딩(Positional Embedding): 단어의 순서를 나타내는 벡터.
3. 세그먼트 임베딩(Segment Embedding): 두 문장을 입력할 때, 첫 번째 문장과 두 번째 문장을 구분하기 위한 임베딩입니다.

2. 양방향 Self-Attention ->  BERT의 핵심은 양방향 Self-Attention입니다. Transformer의 Self-Attention을 사용하여 각 단어가 문장 내에서 양쪽 방향의 단어들과 상호작용합니다.

이렇게 하면, 각 단어가 문장에서 앞뒤의 문맥을 모두 학습할 수 있습니다. 예를 들어, 문장 "나는 사과를 먹었다"에서 "사과"라는 단어는 앞의 "나는", 뒤의 "먹었다"와 모두 상호작용하여 문장 내에서의 정확한 의미를 학습할 수 있습니다.

3. 마스크드 언어 모델(Masked Language Model, MLM) -> BERT는 사전 학습 중 Masked Language Model을 사용합니다. 이는 입력 문장의 일부 단어를 [MASK] 토큰으로 가리고, 모델이 가려진 단어를 예측하도록 훈련하는 방식입니다.

이 방법을 통해 BERT는 문장 내에서 단어 간의 관계를 더 깊이 이해하게 됩니다. 예시: 입력 문장이 "나는 [MASK]를 먹었다"일 때, BERT는 [MASK]에 해당하는 단어가 "사과"임을 추론합니다. MLM의 목적: 문맥 속에서 특정 단어가 무엇인지 추론함으로써, 문장의 양방향 정보를 학습합니다.

4. 다음 문장 예측(Next Sentence Prediction, NSP) -> BERT는 문장 간의 관계도 학습할 수 있도록, NSP라는 추가적인 사전 학습 방법을 사용합니다. 모델에 두 개의 문장을 입력하고, 두 문장이 연속되는 문장인지 아닌지를 예측하는 작업을 수행합니다.
예시:
문장 A: "나는 아침에 일어나서"
문장 B: "커피를 마셨다" → 연속된 문장
문장 B: "나는 축구를 좋아한다" → 연속되지 않은 문장
NSP의 목적: 문장 간의 관계를 학습하여, 긴 문맥을 이해할 수 있는 능력을 배양합니다.
BERT의 학습 과정
BERT의 학습 과정
1. 사전 학습(Pre-training) -> BERT는 대량의 텍스트 데이터(위키피디아, 북 코퍼스 등)를 사용해 Masked Language Model과 Next Sentence Prediction 작업으로 사전 학습을 진행합니다. 이를 통해, BERT는 단어 간의 관계와 문장 간의 관계를 깊이 이해하게 됩니다.
MLM: 문장 내에서 가려진 단어를 예측.
NSP: 두 문장이 연속되는 문장인지 여부를 예측.

2.  미세 조정(Fine-tuning) -> 사전 학습이 완료된 BERT 모델은 특정한 NLP 작업에 맞게 미세 조정됩니다. 미세 조정은 일반적으로 해당 작업에 맞는 소량의 데이터셋으로 이루어지며, 사전 학습된 모델을 기반으로 추가적인 학습을 진행합니다. 예를 들어, 텍스트 분류 작업에서는 분류 레이어를 추가하여 모델이 텍스트의 카테고리를 예측할 수 있도록 조정됩니다.
BERT의 전체적인 구조와 작동 원리 요약
1. 양방향 학습: BERT는 단어 간의 양방향 관계를 학습하여 문맥을 더 깊이 이해합니다.

2. Self-Attention: Transformer의 Self-Attention을 사용해 각 단어가 문장 내에서 다른 단어들과 상호작용합니다.

3. Masked Language Model(MLM): 문장의 일부 단어를 마스킹하고, 이를 예측하는 작업을 통해 단어 간의 관계를 학습합니다.

4. Next Sentence Prediction(NSP): 문장 간의 관계를 학습하여 더 복잡한 문맥 정보를 이해할 수 있습니다.

5. 사전 학습 & 미세 조정: 대규모 데이터로 사전 학습한 후, 특정 작업에 맞춰 미세 조정하여 다양한 NLP 작업에 적용됩니다.
BERT는 이러한 특징 덕분에 문장 이해와 텍스트 분석에서 매우 강력한 성능을 발휘합니다.

비전모델: ResNet
ResNet은 딥러닝의 주요 문제인 "기울기 소실(Gradient Vanishing)" 문제를 해결하면서, 아주 깊은 신경망에서도 좋은 성능을 낼 수 있게 만든 모델입니다. 
ResNet의 가장 큰 혁신은 Residual Learning(잔차 학습)입니다. 일반적으로 신경망이 깊어질수록 기울기 소실로 인해 학습이 어려워집니다. 즉, 네트워크의 층(layer)을 많이 쌓으면 쌓을수록 역전파(Backpropagation) 과정에서 기울기가 소실되어, 깊은 층에서는 학습이 제대로 이뤄지지 않습니다.

ResNet은 이 문제를 해결하기 위해 Residual Block이라는 구조를 도입하여, 입력(input)과 출력(output)을 직접 연결하는 스킵 연결(skip connection)**을 추가했습니다. 이 방식은 네트워크가 더 깊어져도 학습을 안정적으로 할 수 있게 도와줍니다.
주요 목표
더 깊은 신경망을 학습 가능하게: 일반적인 CNN(합성곱 신경망)보다 훨씬 더 깊은 네트워크를 구성하여, 더 복잡한 패턴을 학습할 수 있게 만듭니다.
기울기 소실 문제 해결: 잔차 학습과 스킵 연결을 통해 네트워크가 깊어질 때 발생하는 기울기 소실 문제를 완화합니다.
구성 요소
1. Residual Block (잔차 블록) -> ResNet의 핵심은 Residual Block입니다. 이 블록은 일반적인 신경망과 다르게, 입력을 그대로 출력에 더해줍니다. 즉, 입력이 스킵 연결(skip connection)을 통해 그대로 출력으로 전달됩니다.
기존 CNN 구조: 입력 → 여러 층(Layer) 통과 → 출력.
Residual Block: 입력 → 여러 층 통과 + 입력(스킵 연결) → 출력.
x는 블록의 입력.
F(x)는 일반적인 신경망 층을 통과한 출력.
y는 최종 출력.
스킵 연결은 x를 그대로 y에 더해주는 역할을 합니다.
이 방식 덕분에 모델은 잔차(Residual)만 학습하면 되므로, 기울기 소실 문제를 줄이고 더 깊은 네트워크를 안정적으로 학습할 수 있습니다.

2. 스킵 연결(Skip Connection) -> 스킵 연결은 입력을 출력에 더해주는 단순한 구조이지만, 매우 중요한 역할을 합니다. 이 연결이 없으면 네트워크가 깊어질수록 학습이 어려워지지만, 스킵 연결 덕분에 네트워크는 학습해야 할 내용이 줄어들어 학습이 훨씬 더 효율적입니다.

스킵 연결의 주요 장점
기울기 소실 완화: 역전파 시 기울기 값이 스킵 연결을 통해 바로 전해지므로, 깊은 층에서도 학습이 원활하게 이뤄집니다.
정체 문제 해결: 일반적인 깊은 네트워크에서는 층을 쌓을수록 성능이 더 나빠지는 정체 문제(degradation)가 발생할 수 있지만, ResNet은 이를 해결합니다.

3. Bottleneck 구조 -> ResNet의 깊은 모델(ResNet-50, ResNet-101, ResNet-152)에서는 Bottleneck Block이라는 구조를 사용합니다. 이는 3개의 층(3 layers)으로 구성된 Residual Block으로, 연산량을 줄이고 더 깊은 네트워크를 효율적으로 학습할 수 있게 도와줍니다.

Bottleneck 구조는 다음과 같이 구성됩니다:
1x1 합성곱(Conv layer) → 3x3 합성곱(Conv layer) → 1x1 합성곱(Conv layer)

이 구조는 입력의 차원을 줄이고, 중간에서 정보를 처리한 후 다시 차원을 늘려주는 방식입니다. 이렇게 하면 파라미터 수를 줄이면서도 모델의 성능을 유지할 수 있습니다.
학습 원리
1. 잔차 학습(Residual Learning) -> ResNet의 핵심 아이디어는 잔차(Residual)를 학습한다는 것입니다. 일반적인 신경망은 입력을 변환하여 출력을 만들어내지만, ResNet은 입력과 출력의 차이(잔차)를 학습합니다. 이는 네트워크가 직접 출력 전체를 예측하는 것이 아니라, 출력과 입력의 차이만 예측하게 만들어 학습을 쉽게 합니다.

이 방식은 특히 네트워크가 매우 깊어질 때 학습이 효율적으로 이뤄지게 합니다. 깊은 네트워크에서도 잔차(Residual)만 학습하면 되므로, 기울기 소실 문제가 줄어듭니다.

2. 역전파(Backpropagation) -> 스킵 연결 덕분에, 역전파 시 기울기가 스킵 연결을 통해 직접 전달되므로 기울기 소실 문제가 완화됩니다. 이는 깊은 층에서도 학습이 원활하게 진행될 수 있게 돕습니다.

3. Bottleneck 구조의 효율성 -> Bottleneck Block을 사용하면 파라미터 수를 줄이면서도 성능을 유지할 수 있습니다. 이는 특히 ResNet-50 이상의 깊은 네트워크에서 매우 중요합니다. Bottleneck Block은 1x1 합성곱을 통해 채널 수를 줄이고, 중간에서 3x3 합성곱을 적용한 후 다시 1x1 합성곱을 통해 차원을 늘리는 방식으로 연산 효율을 극대화합니다.
ResNet 종류
1. ResNet-18 18개의 레이어로 구성된 ResNet. 비교적 얕은 네트워크로, 기본적인 Residual Block 구조를 사용합니다.

2. ResNet-34 34개의 레이어로 구성된 ResNet. 깊이가 깊어지면서 더 복잡한 패턴을 학습할 수 있습니다.

3. ResNet-50 50개의 레이어로 구성된 ResNet. Bottleneck Block을 사용하여 더 깊은 네트워크를 학습할 수 있습니다.

4. ResNet-101 101개의 레이어로 구성된 ResNet. 매우 깊은 네트워크로, 복잡한 이미지 인식 작업에서 뛰어난 성능을 보입니다.

5. ResNet-152 152개의 레이어로 구성된 ResNet. ResNet 중 가장 깊은 모델 중 하나로, 매우 복잡한 데이터를 처리할 수 있습니다.
ResNet의 응용과 성능
ResNet은 이미지 인식, 객체 검출, 분할 등의 컴퓨터 비전 작업에서 뛰어난 성능을 발휘합니다. ResNet의 잔차 학습과 스킵 연결 덕분에 깊은 네트워크도 안정적으로 학습할 수 있어, 복잡한 이미지 패턴을 더 잘 이해할 수 있습니다.
이미지 분류: ResNet은 이미지 분류 작업에서 우수한 성능을 보여주며, 딥러닝의 표준 모델로 자리 잡았습니다.

객체 검출: Faster R-CNN과 같은 객체 검출 모델에서 백본(기본 네트워크)으로 ResNet을 사용해 성능을 높일 수 있습니다.

이미지 분할: U-Net과 같은 이미지 분할 모델에서도 ResNet을 백본으로 사용하여 더욱 정교한 분할이 가능합니다.

다양한 이미지 처리 모델
1. ResNet -> 잔차 학습을 통한 학습

2. VGG -> VGG는 여러 개의 3x3 합성곱층(convolutional layer)과 풀링층(pooling layer)을 연속적으로 쌓아 만든 심층 신경망입니다. 네트워크는 입력 이미지로부터 점진적으로 더 깊은 특징(Feature)을 추출하는 역할을 합니다. VGG는 깊이(depth)와 필터(filter)의 수를 늘림으로써 성능을 향상시킵니다.

VGG의 가장 대표적인 모델은 VGG16과 VGG19로, 각각 16개와 19개의 가중치 층이 있습니다. 여기서 가중치 층이란 합성곱 층과 완전 연결층(Fully Connected Layer)을 말합니다.

핵심 원리
작은 필터(3x3)를 반복 사용 -> VGG의 핵심 아이디어는 작은 크기의 필터(3x3)를 여러 번 사용하는 것입니다. 3x3 필터는 매우 작은 크기이지만, 여러 개의 3x3 합성곱 층을 연속으로 쌓으면 **더 큰 리셉티브 필드(Receptive Field)**를 갖게 되어 이미지의 더 넓은 영역을 한 번에 처리할 수 있습니다.

예를 들어, 두 개의 3x3 필터를 연속으로 사용하면 5x5 필터와 비슷한 효과를 냅니다. 3x3 필터는 학습 파라미터의 수를 줄이면서도 성능을 유지하거나 개선하는 데 도움을 줍니다. 또한 여러 층을 깊이 있게 쌓음으로써 더 복잡한 패턴을 인식할 수 있습니다.

풀링층(Pooling Layer) -> 풀링층은 합성곱 층 뒤에 위치하며, 특징 맵(feature map)의 크기를 줄이는 역할을 합니다. VGG에서는 **최대 풀링(Max Pooling)**을 사용하여 크기를 절반으로 줄입니다. 이를 통해 네트워크가 복잡도를 줄이고 계산 속도를 높이며, 동시에 모델이 공간적인 계층 구조를 학습할 수 있습니다. 2x2 크기의 풀링 필터를 사용하여 특징 맵의 크기를 줄이면서 유용한 정보는 보존합니다.

VGG는 구조가 매우 단순하며, 3x3 합성곱 층과 2x2 풀링 층을 반복해서 쌓은 것 외에 특별한 것이 없습니다. 이는 쉽게 구현할 수 있으며 확장성도 뛰어납니다.

3. Inception -> Inception 구조는 CNN(Convolutional Neural Network)의 성능을 극대화하기 위해 설계된 독특한 아키텍처로, 네트워크의 깊이와 너비를 동시에 확장할 수 있는 방법을 제안합니다. 이를 통해 계산 비용을 효율적으로 줄이면서도 성능을 극대화할 수 있습니다.
Inception의 주요 개념은 "Inception Module"이라는 특별한 블록입니다. 이 모듈은 여러 종류의 필터 크기(1x1, 3x3, 5x5)를 동시에 사용하여 다양한 공간적 정보를 추출하고, 이 결과를 다시 채널 방향으로 병합(concatenate)하는 방식입니다.
Inception Module의 레이어 구성:
1x1 합성곱(Convolution): 적은 수의 필터로 차원을 축소하며, 계산 비용을 줄이는 역할을 합니다.
3x3 합성곱: 작은 영역에서 특징을 추출합니다.
5x5 합성곱: 더 넓은 영역에서 특징을 추출합니다.
3x3 최대 풀링(Max Pooling): 풀링을 통해 차원 축소 및 불필요한 정보를 제거합니다.

각기 다른 크기의 필터들을 사용함으로써 다양한 크기의 패턴을 인식할 수 있고, 이를 결합해 더 나은 특징 맵을 생성할 수 있습니다.
예시(Inception Module):
입력: 28x28x192 크기의 특징 맵이 들어오면,
1x1 합성곱: 28x28x64
3x3 합성곱: 28x28x128
5x5 합성곱: 28x28x32
3x3 최대 풀링 후 1x1 합성곱: 28x28x32
마지막으로 이 모든 출력을 채널 방향으로 병합해 28x28x256의 출력이 됩니다.

일반적인 CNN 구조는 깊이(depth)를 늘려서 더 복잡한 패턴을 학습하는 방식이었지만, 이는 계산 비용을 증가시킵니다. Inception 구조는 너비(width)와 깊이를 동시에 늘림으로써 효율적으로 다양한 크기의 특징을 추출할 수 있게 했습니다.

필터 크기의 다양성: Inception 모듈에서는 1x1, 3x3, 5x5 필터를 동시에 적용하여, 이미지의 다양한 크기와 형태의 패턴을 인식합니다.

차원 축소를 위한 1x1 합성곱: 1x1 합성곱을 사용하여 채널 수를 줄이는 동시에, 차원 축소를 통해 계산량을 줄입니다. 이는 병목 현상을 방지하고, 더 깊고 넓은 네트워크를 만들 수 있게 해 줍니다.

YOLO
YOLO(You Only Look Once) 모델은 객체 탐지(object detection) 분야에서 매우 혁신적인 접근 방식을 제안한 CNN 기반의 알고리즘입니다. YOLO의 주요 특징은 전체 이미지를 한 번에 분석하여 객체를 탐지하는 방식입니다. 이는 기존의 슬라이딩 윈도우 방법이나 지역 제안 기반 방법과는 다른 방식으로, 매우 빠른 속도를 자랑합니다.

 

기본 개념
YOLO는 이미지를 격자(grid)로 나누고, 각 격자에서 객체가 있을 확률과 해당 객체의 바운딩 박스(bounding box) 좌표를 예측합니다. YOLO는 객체 탐지와 분류를 동시에 수행하여, 단일 신경망을 통해 전체 이미지를 한 번만 바라봄으로써 성능을 극대화합니다.
구조
1. 입력 이미지 -> 입력 이미지는 보통 448x448 또는 416x416 크기로 조정됩니다. 이는 YOLO가 고속으로 처리할 수 있도록 최적화된 크기입니다.
2. 네트워크 아키텍처 -> 
YOLO의 아키텍처는 다음과 같은 레이어로 구성됩니다.
합성곱 층(Convolutional Layer): 다양한 필터를 사용하여 이미지의 특징을 추출합니다.

활성화 함수(Activation Function): ReLU(Rectified Linear Unit)와 같은 활성화 함수를 사용해 비선형성을 추가합니다.

풀링 층(Pooling Layer): Max Pooling을 통해 특징 맵의 차원을 축소합니다.

완전 연결층(Fully Connected Layer): 최종적으로 바운딩 박스의 좌표와 클래스 확률을 예측합니다.

YOLO는 이 과정을 통해 입력 이미지에서 특징을 추출하고, 객체의 위치 및 클래스 정보를 얻습니다.
YOLO의 예측 과정
1. 격자(grid) 분할 -> 입력 이미지를 SxS 크기의 격자로 나눕니다. 각 격자는 이미지 내에서 객체를 탐지할 수 있는 지역을 나타냅니다. 예를 들어, 7x7 격자로 나누면, 총 49개의 격자가 생깁니다.
2. 바운딩 박스 예측 -> 각 격자는 최대 K개의 바운딩 박스를 예측합니다. YOLO는 바운딩 박스의 좌표를 정규화하여 예측합니다. 이는 모델이 다양한 크기의 이미지에 대해서도 안정적으로 작동할 수 있도록 돕습니다.
3. 클래스 확률 예측 -> 각 격자는 각 객체 클래스에 대한 확률을 예측합니다. 이 확률은 특정 격자에 해당 객체가 존재할 확률을 의미합니다. 
4. 결합 -> YOLO는 각 격자에서 예측된 바운딩 박스와 클래스 확률을 결합하여 최종 예측 결과를 생성합니다. 이 과정에서 NMS(Non-Maximum Suppression)를 사용하여 중복된 바운딩 박스를 제거하고, 최종 결과를 정제합니다.
5. NMS(Non-Maximum Suppression) -> YOLO는 다수의 바운딩 박스가 예측될 수 있기 때문에, NMS를 사용하여 중복된 박스를 제거합니다. NMS는 다음과 같은 과정을 따릅니다: Confidence Score 정렬: 각 바운딩 박스의 신뢰도에 따라 정렬합니다.
가장 높은 신뢰도를 가진 박스 선택: 가장 높은 신뢰도를 가진 바운딩 박스를 선택하고, 해당 박스와의 IOU가 일정 기준(예: 0.5) 이상인 바운딩 박스를 제거합니다. 반복: 더 이상 신뢰도가 높은 박스가 없을 때까지 반복합니다.

이미지 세그멘테이션
이미지 세그멘테이션은 이미지의 각 픽셀에 대해 특정 클래스를 할당하는 과정을 의미합니다. 이는 객체 인식과는 다르게 객체의 경계를 더 정밀하게 파악할 수 있게 해줍니다. 이미지 세그멘테이션의 대표적인 접근 방식에는 FCN(Fully Convolutional Network), U-Net, Mask R-CNN 등이 있습니다.

 

기본 개념
픽셀 단위 분류: 이미지 세그멘테이션은 입력 이미지의 각 픽셀을 특정 클래스에 할당합니다. 예를 들어, 사진 속의 고양이와 배경을 구분하여 고양이에 해당하는 픽셀은 하나의 클래스, 배경은 다른 클래스에 할당합니다.

세그멘테이션 마스크: 각 픽셀에 대해 클래스를 할당한 결과를 세그멘테이션 마스크라고 부릅니다. 마스크는 입력 이미지와 동일한 크기를 가지며, 각 픽셀에 해당하는 클래스 인덱스나 클래스 확률을 포함합니다.
시맨틱 세그멘테이션과 인스턴스 세그멘테이션
시맨틱 세그멘테이션 (Semantic Segmentation)은 이미지의 각 픽셀을 특정 클래스에 할당하여 객체의 클래스 정보를 부여하는 과정입니다. 즉, 이미지 내에서 같은 클래스에 속하는 모든 픽셀을 동일한 레이블로 마킹합니다.

주요 특징
픽셀 단위 분류: 각 픽셀은 특정 클래스(예: 고양이, 배경)로 분류됩니다.

클래스 구분: 같은 클래스에 속하는 객체는 모두 같은 레이블을 갖습니다. 예를 들어, 이미지에 여러 마리의 고양이가 있으면 모든 고양이 픽셀은 "고양이" 레이블로 마킹됩니다.

경계 구분 없음: 개별 객체의 경계는 구분되지 않으며, 각 객체는 같은 클래스에 속하는 것으로 처리됩니다.

예를 들면, 이미지에서 고양이와 배경을 구분하여 고양이 픽셀은 "1", 배경 픽셀은 "0"으로 마킹합니다. 모든 고양이는 같은 레이블을 갖기 때문에 서로 다른 고양이를 구별하지 않습니다.


인스턴스 세그멘테이션 (Instance Segmentation)은 시맨틱 세그멘테이션의 발전된 형태로, 각 객체 인스턴스를 개별적으로 식별하고 분할하는 과정입니다. 즉, 같은 클래스에 속하는 서로 다른 객체를 구별할 수 있습니다.

주요 특징
객체 인스턴스 구분: 같은 클래스에 속하는 서로 다른 객체에 대해 각기 다른 레이블을 부여합니다. 예를 들어, 두 마리의 고양이를 각각 "고양이 1"과 "고양이 2"로 구분합니다.

정확한 경계: 객체 간의 경계를 명확히 하고, 각 객체의 형태를 정확하게 표현합니다.

예를 들어, 이미지에 두 마리의 고양이가 있는 경우, 첫 번째 고양이는 "고양이 1"로, 두 번째 고양이는 "고양이 2"로 레이블링됩니다. 따라서 같은 클래스에 속하지만 서로 다른 객체로 취급됩니다.
주요 모델
1. FCN (Fully Convolutional Network)
기본 구조: FCN은 CNN 기반의 아키텍처로, 일반 CNN의 마지막 레이어를 fully connected layer 대신 convolutional layer로 대체하여 픽셀 단위의 예측을 가능하게 합니다.
아키텍처 구성:
인코더: 일반적인 CNN과 마찬가지로 여러 개의 합성곱층(convolutional layers)과 풀링층(pooling layers)을 사용하여 특징을 추출합니다.

디코더: 특징 맵을 원래 이미지 크기로 복원하기 위한 transposed convolutional layers(역합성곱층)를 사용합니다. 이는 spatial resolution을 회복하여 픽셀 단위의 출력을 생성합니다.

업샘플링(Up-sampling): FCN의 출력은 다운샘플링된 특징 맵입니다. 이를 원래 이미지 크기로 되돌리기 위해 transposed convolution을 사용하여 upsampling을 수행합니다.

Skip Connections: 인코더에서 얻은 고해상도 특징을 디코더의 낮은 해상도 특징과 결합하여 더 정밀한 세그멘테이션 결과를 얻습니다. 이는 세그멘테이션의 경계를 더 잘 정의할 수 있게 도와줍니다.

손실 함수: 일반적으로 픽셀 단위의 크로스 엔트로피 손실 함수가 사용됩니다. 각 픽셀에 대한 예측 결과와 실제 레이블 간의 차이를 계산하여 모델의 성능을 평가합니다.

2. U-Net
U-Net 구조: U-Net은 의료 이미지 세그멘테이션을 위해 설계된 아키텍처로, U자 형태의 구조를 가지고 있습니다. 인코더와 디코더가 대칭적으로 구성되어 있습니다.

인코더(Contracting Path): 여러 개의 합성곱층과 풀링층으로 구성되며, 이미지의 해상도를 점차적으로 줄여가면서 특징을 추출합니다. 각 합성곱층에서는 ReLU 활성화 함수를 사용합니다.

디코더(Expansive Path): 인코더에서의 특징 맵을 업샘플링하여 원래 이미지 크기로 복원합니다. 각 디코더 단계에서는 업샘플링한 특징 맵과 인코더의 대응하는 특징 맵을 concatenate(연결)하여 더 많은 정보를 활용합니다.

Skip Connections: 인코더와 디코더 간의 skip connections는 중요한 정보 손실을 방지하며, 경계를 더욱 뚜렷하게 만듭니다.

최종 출력: 마지막에 1x1 합성곱을 적용하여 각 픽셀에 대해 클래스 확률을 출력합니다. 이 결과는 크로스 엔트로피 손실 함수로 평가됩니다.

손실 함수: U-Net에서도 픽셀 단위의 크로스 엔트로피 손실이 사용되며, 추가적으로 Dice coefficient 손실을 사용할 수 있습니다. Dice 손실은 두 세트 간의 유사성을 측정하여, 특히 불균형한 데이터셋에서 성능을 개선하는 데 유용합니다.

3. Mask R-CNN
Mask R-CNN은 객체 탐지와 인스턴스 세그멘테이션을 동시에 수행할 수 있는 강력한 딥러닝 모델입니다. 다양한 구조와 세부 기술을 활용하여 이미지에서 객체의 정확한 위치와 경계를 예측할 수 있어 다양한 응용 분야에서 활용됩니다. 
Mask R-CNN의 전체 아키텍처는 다음과 같은 주요 구성 요소로 이루어져 있습니다:

백본(Backbone): 일반적으로 ResNet, ResNeXt, 또는 MobileNet과 같은 CNN을 사용하여 이미지에서 특징을 추출합니다. 이 단계에서 입력 이미지를 처리하여 특징 맵을 생성합니다.

Region Proposal Network (RPN): 이미지 내에서 관심 영역(Region of Interest, RoI)을 제안합니다. RPN은 입력된 특징 맵에서 객체가 있을 법한 위치를 찾아내며, 각각의 제안된 RoI에 대한 점수(객체 존재 확률)와 위치를 반환합니다.

RoI Align: 제안된 RoI를 정확히 특징 맵에 맞추기 위해 RoI Align을 사용합니다. 이 과정에서 각 RoI를 고정된 크기로 조정하여 더 세밀한 세그멘테이션을 수행할 수 있도록 합니다.

클래스 분류 및 박스 회귀: 각 RoI에 대해 객체의 클래스(예: 고양이, 개 등)를 분류하고, 객체의 경계 상자를 보정하는 작업을 수행합니다.

마스크 분기: 각 RoI에 대해 객체의 마스크를 예측합니다. 이 부분이 Mask R-CNN의 핵심 기능으로, 각 객체의 픽셀 단위 세그멘테이션 마스크를 생성합니다.

주요 구성 요소
1. Backbone: Mask R-CNN의 backbone은 ResNet이나 FPN(Feature Pyramid Network)과 같은 구조를 사용하여 다중 스케일의 특징을 추출합니다. 이 특징은 이후 RPN에서 사용됩니다.

2. Region Proposal Network (RPN)
RPN은 이미지에서 객체가 있을 가능성이 높은 영역을 찾아내는 역할을 합니다. 여러 개의 anchor boxes를 생성하여 각 박스에 대한 objectness score를 계산하고, 이를 기반으로 최종 RoI를 선택합니다.

anchor boxes: 다양한 크기와 비율로 정의된 사각형 영역으로, 객체의 위치와 크기를 예측하는 데 사용됩니다.

3. RoI Align: RoI Align은 RPN에서 생성된 RoI를 특징 맵에 맞추는 과정으로, 기존의 RoI Pooling과 달리 부드러운 보간(interpolation) 기법을 사용하여 더 정확한 결과를 얻습니다. 이 과정은 객체의 정확한 경계를 유지하는 데 도움을 줍니다.

4. 마스크 분기: 각 RoI에 대해 세그멘테이션 마스크를 예측하는 부분입니다. 이를 위해 1x1 합성곱층을 통해 클래스별로 마스크를 생성하며, 각각의 마스크는 해당 RoI의 픽셀에 대해 객체의 존재 여부를 나타냅니다.

손실 함수
Mask R-CNN의 손실 함수는 크게 세 가지로 나눌 수 있습니다:
1. 클래스 분류 손실: 각 RoI에 대해 예측한 클래스와 실제 클래스 간의 차이를 계산합니다. 일반적으로 크로스 엔트로피 손실이 사용됩니다.

2. 박스 회귀 손실: 예측한 경계 상자와 실제 경계 상자 간의 차이를 계산합니다. 주로 Smooth L1 손실을 사용하여 회귀를 수행합니다.

3. 마스크 손실: 각 RoI에 대해 예측한 세그멘테이션 마스크와 실제 마스크 간의 차이를 계산합니다. 이 또한 크로스 엔트로피 손실이 사용됩니다.

여기까지..