https://programmers.co.kr/learn/courses/30/lessons/81301;

 

코딩테스트 연습 - 숫자 문자열과 영단어

네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다. 다음은 숫자의 일부 자

programmers.co.kr

 

 

#include <string>
#include <vector>
#include <map>

using namespace std;

int solution(string s) {
	int answer = 0;
	string s_answer;
	string check;
	map<string, string> dict;

	dict["zero"] = '0';
	dict["one"] = '1';
	dict["two"] = '2';
	dict["three"] = '3';
	dict["four"] = '4';
	dict["five"] = '5';
	dict["six"] = '6';
	dict["seven"] = '7';
	dict["eight"] = '8';
	dict["nine"] = '9';

	for (int i = 0; i < s.size(); i++)
	{
		if (s[i] >= '0' && s[i] <= '9')
		{
			s_answer += s[i];
		}
		else
		{
			check += s[i];
            if (dict.find(check) != dict.end())
			{
				s_answer += dict[check];
				check.clear();
			}
		}
	}

	answer = atoi(s_answer.c_str());

	return answer;
}

int main() {
	solution("one4seveneight");
}

'알고리즘 > Coding Test' 카테고리의 다른 글

음양 더하기 C++  (0) 2022.05.19
없는 숫자 더하기 C++  (0) 2022.05.19
키패드 누르기 C++  (0) 2022.05.19
신규 아이디 추천 C++  (0) 2022.05.18
신고 결과 받기 C++  (0) 2022.05.17

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

string solution(string new_id)
{
	string answer = "";

	for (int i = 0; i < new_id.size(); i++)
	{
		int size = new_id.size();
		// 1단계 대문자 -> 소문자 바꾸기
		if (new_id[i] >= 65 && new_id[i] <= 90)
		{
			new_id[i] += 32;
		}
		// 2단계 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
		else if (new_id[i] != 46 && new_id[i] != 45 && new_id[i] != 95 && !(new_id[i] >= 48 && new_id[i] <= 57) && !(new_id[i] >= 97 && new_id[i] <= 122))
		{
			new_id.erase(i, 1);
			i -= 1;
		}
		// 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
		else if (new_id[i] == 46 && new_id[i + 1] == 46) // || (new_id[i] == 46 && new_id[i - 1] == 46))
		{
			new_id.erase(i, 1);
			i -= 1;
		}
		else if (i >= 1 && new_id[i] == 46 && new_id[i - 1] == 46)
		{
			new_id.erase(i, 1);
			i -= 1;
		}
		// 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거
		else if (new_id[0] == 46) { new_id.erase(0, 1); i -= 1; }
		else if (new_id[size - 1] == 46) { new_id.erase(new_id.size() - 1, 1); i -= 1; }
	}

	// 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입
	if (new_id.size() == 0)
	{
		new_id.append("a");
	}

	for (int i = 0; i < new_id.size(); i++)
	{
		int size = new_id.size();
		// 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
		if (new_id.size() >= 16)
		{
			new_id = new_id.substr(0, 15);
		}
		// 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
		else if (new_id[0] == 46) { new_id.erase(0, 1); i -= 1; }
		else if (new_id[size - 1] == 46) { new_id.erase(new_id.size() - 1, 1); i -= 1; }

		// 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복
		else if (new_id.size() <= 2)
		{
			for (int i = 0; i < 3; i++)
			{
				new_id += new_id[size - 1];
				if (new_id.size() >= 3) { break; }
			}
		}
	}

	answer = new_id;

	return answer;
}

int main() {
	solution("abcdefghijklmn.p");
}

'알고리즘 > Coding Test' 카테고리의 다른 글

음양 더하기 C++  (0) 2022.05.19
없는 숫자 더하기 C++  (0) 2022.05.19
키패드 누르기 C++  (0) 2022.05.19
숫자 문자열과 영단어 C++  (0) 2022.05.18
신고 결과 받기 C++  (0) 2022.05.17

https://programmers.co.kr/learn/courses/30/lessons/92334

 

코딩테스트 연습 - 신고 결과 받기

문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의

programmers.co.kr

#include <string>
#include <vector>
#include <sstream>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

vector<string> split(string sentence, char Seperator)
{
	vector<string> answer;
	stringstream ss(sentence);
	string tmp;

	while (getline(ss, tmp, Seperator))
	{
		answer.push_back(tmp);
	}

	return answer;
}

vector<int> solution(vector<string> id_list, vector<string> report, int k) {
    
	vector<int> answer(id_list.size(), 0);
	vector<int> report_list(id_list.size(), 0);	// 신고 당한 횟수
	set<string> remove_overlap;	// 중복 제거할 set 변수
	map<int, vector<int>> check_list;	// 누굴 신고했는지

	// 중복 제거
	for (auto x : report) { remove_overlap.insert(x); }

	// Parsing 및 신고당한 횟수
	for (auto report_tmp : remove_overlap)
	{
		// Parsing
		vector<string> split_report = split(report_tmp, ' ');

		// 신고당한 횟수 Up
		int reported = find(id_list.begin(), id_list.end(), split_report[1]) - id_list.begin();
		report_list[reported] += 1;

		// 신고한 사람 등록
		int reporter = find(id_list.begin(), id_list.end(), split_report[0]) - id_list.begin();
		check_list[reporter].push_back(reported);
	}

	// 신고한 사람한테 안내메일 (k회 이상 신고당한 사람)
	for (auto check : check_list)
	{
		int reporter = check.first;	// 신고한 사람
		// check.second : 신고당한 사람
		for (int i = 0; i < check.second.size(); i++)
		{
			if (report_list[check.second[i]] >= k)
			{
				answer[reporter] ++;
			}
		}
	}

	return answer;
}

'알고리즘 > Coding Test' 카테고리의 다른 글

음양 더하기 C++  (0) 2022.05.19
없는 숫자 더하기 C++  (0) 2022.05.19
키패드 누르기 C++  (0) 2022.05.19
숫자 문자열과 영단어 C++  (0) 2022.05.18
신규 아이디 추천 C++  (0) 2022.05.18

합성곱 신경망 (CNN)

 

CNN은 위와 같이 Filter가 움직이며 이미지의 feature map을 추출하는 형식입니다.

즉, Filter를 한번 연산시 이미지의 전체를 고려하기 보다는 일부분만 고려하여 특성값을 추출합니다.

Low Level Layer (얕은 신경망)에서는 작은 패턴 Tiny Pattern - ex) edge, color

Hight Level Layer (깊은 신경망)에서는 전체적인 object를 봅니다.

예를 들면,

r1의 값은 x1, x2, x3으로 연산이 되고,

r2의 값은 x1, x2, x3으로 연산이 되고,

r3의 값은 x2, x3, x4로 연산이 이루어집니다. - 작은패턴

 

다음으로

p1은 r1, r2, r3로 연산이 이루어지는데 즉, p1은 x1, x2, x3, x4가 다 사용되는 겁니다. - 전체적인 object

 

구조적으로 간접적인 영향밖에 없기 때문에 이러한 국소적인 메커니즘이 전체를 봐야하는 경우에는 단점이 됩니다.

 

 


Attention

일단 Attention은 CNN에서 Filter를 사용하여 부분 부분 보는것과는 다르게

이미지의 전체를 봅니다.

1 x 1 Conv를 적용하면 전체의 이미지를 나타낼 수 있는 Feature Map이 생성이 됩니다.

이 Feature Map에 원본 이미지와 같은 크기, 각 픽셀마다의 중요도를 설정하여 곱셈을 하게 됩니다.

이것을 Attention이라고 합니다.


Key, Query, Value

 

Key, Query, Value는 Data Base에서 나온 개념입니다.

 

간단한 구조로 보겠습니다.

 

'a' : 1

'b' : 2

'c' : 3

 

위를 예시로 들면 'a', 'b', 'c' 는 각각 1, 2, 3 을 대표하는 값이고

원하는 데이터를 찾기 위해서 데이터 베이스에 요청을 보냅니다.

 

여기서

'a', 'b', 'c' = Key

1, 2, 3 = Value

요청 = Query

입니다.

 

즉, Vision Transformer 에서는 Query로 중요한 Key값만 불러오고,

Key에 따른 Value의 값을 구해오는 것입니다.

 

 


Transformer

위의 사진은 일반적으로 자연어 처리에 사용되는 Transformer의 구조입니다.

크게 보면 왼쪽은 Encoder, 오른쪽은 Decoder입니다.

 

일단, Data의 예를 들어보겠습니다.

1) 저는 학생입니다.

2) I am a student.

1번 데이터는 Input 값이고, 2번 데이터는 Output 값입니다.

 

Train일때,

Encoder에는 1번 데이터가 들어가고, Decoder에는 2번 데이터가 들어가게 됩니다.

또한, 여기서 중요한 점은 Positional Encoding입니다.

Positional Encoding은 글자의 위치를 나타내주는 값입니다.

 

Test일때,

Encoder에는 1번 데이터가 들어가고, Decoder에는 빈 데이터가 들어가게 됩니다.

 

Positional Encoding: https://velog.io/@gibonki77/DLmathPE

 

[Transformer]-1 Positional Encoding은 왜 그렇게 생겼을까? 이유

트랜스포머의 입력은 RNN과 달리 한꺼번에 모든 요소가 들어가기 때문에, 위치관계의 패턴을 Encode해주는데요. 주로 사용되는 Sinusoidal Positional Encoding의 장점에 대해 알아보겠습니다.

velog.io

 

 

 


Vision Transformer

 

이제는 이미지에서의 Transformer를 살펴보겠습니다.

자연어 처리에서는 단어별로 끊어서 사용했다면, 이미지에서는 일정 크기로 분할을 하여 사용합니다.

예를 들어, 6x6 행렬을 3x3으로 나눈다고 하면

위와 같이 나누어서 Encoding을 해주는 것입니다.

여기서 어떠한 크기로 나눌것인지는 사용자 마음대로 정해줄 수 있습니다.

 

ex) 3 x 6 x 6 행렬이 있다면 3 x 4 x 3 x 3으로 나누어 주는 것입니다.

 

자른 이미지 하나하나를 패치라고 부릅니다.

 

 


Code

 

'Deep Learning > Vision' 카테고리의 다른 글

PIP-Net 논문 정리  (0) 2023.02.16
FaceBoxes 논문 정리  (0) 2023.02.03
05. Yolo 버전별 비교  (0) 2022.05.13
04. Faster RCNN [Vision, Object Detection]  (0) 2022.02.09
03. Fast RCNN [Vision, Object Detection]  (0) 2022.01.21

Object Detection 분류

 

Object Detection에는 Localization과 Classification 두가지 절차가 있습니다.

  • Localization : Image에서 객체가 있을 만한 위치를 찾는 것.
  • Classification : 어떤 물체인지 판단하는 것.

 

2 Stage는 Localization (ex : Selective Search, RPN ...) → Classification 순서로 진행이 되고,

 

1 Stage는 Localization과 Classification이 동시에 처리합니다.

 

1 Stage는 2 Stage보다 처리 속도는 빠르지만 정확도면에서는 뒤떨어지는 경향이 있다고 합니다.

(그런데 요즘 1 Stage도 굉장히 좋아져서 잘 모르겠다.)

 

RCNN 계열은 2 Stage, Yolo는 1 Stage라고 보면 됩니다.

 

 


 

Yolo (You Only Look Once)

 

Yolo는 1 Stage Object Detection Model 입니다.

 

2 Stage인 RCNN 계열은 RPN을 통해 객체를 찾고, 그 부분을 따로 Classification 해줍니다.

 

즉, RCNN 계열보다 속도가 더 빠르기 때문에 실시간으로 이용하기에는 더욱 적절합니다.

 

버전별로 살펴보겠습니다.

 

 


 

 

Yolo v1

 

Yolov1

 

※ 특징

  • Backbone : VGG 16
  • Input Image를 7 x 7 의 Grid로 나눕니다.
  • Bounding Box의 개수는 Grid당 2개씩 있습니다.
  • 한 그리드당 (B x 5 + C) 크기의 Output 값이 나옵니다. → 최종 (7 x 7) x (B x 5 + C)
    • B : 2개의 BBox 정보가 들어있다.
      1. x : Bounding Box의 중심 x좌표
      2. y : Bounding Box의 중심 y좌표
      3. w : Bounding Box의 너비
      4. h : Bounding Box의 높이
      5. confidence-score : \( Pr(Object) * IoU \)
    • C : 어느 특정 Class에 속하는지. (Class의 개수만큼의 크기로 나옴)
      • ex) Class가 10이면 ( 0, 0, 1, 0, 0, ..., 0 )
  • BBox가 2개이지만 한 Grid당 Object 하나만 Detection 가능합니다.
    • 위의 설명과 같이 2개의 BBox 정보가 들어있지만, Class는 하나밖에 없습니다.

 

 

※ Yolov1 의 문제점

  • 여러 물체들이 겹쳐있으면 제대로 된 예측이 어렵습니다. - 하나의 Grid 당 하나의 Object
  • 물체가 작을수록 정확도가 감소합니다.
  • 학습할때 사용된 BBox와 크기가 많이 다른 형태는 정확히 예측하지 못합니다.

 

 


 

 

Yolo v2

 

Yolov2
Darknet 19

 

※ 특징

  • Backbone : Darknet 19
  • Input Image를 13 x 13 의 Grid로 나눕니다.
  • Yolov1에서 사용되었던 Fully connected 사라집니다.
  • BatchNormalization 사용합니다.
  • 위 사진의 노란 부분을 추가함으로써 작은 Object도 Detection 할 수 있도록 했습니다.
  • Grid 당 Anchor Box 5개 씩
    • Anchor Box : Grid당 여러개의 Bounding Box를 배치 - 아래 사진은 예시!

Anchor Box 예시

  • Yolo v1과는 다르게 하나의 Grid에서도 여러 객체를 Detection 할 수 있습니다.
    • Output shape : 13 x 13 x B(5 + C)
    • 즉, Yolo v1과는 다르게 모든 BBox에 대한 정보를 Output으로 가집니다.

 

Bounding Box Regression

  • Bounding Box Regression : Anchor Box의 좌표를 객체에 더욱 알맞게 조정해줍니다.
    • \(  \sigma(x) \) : sigmoid(x)
    • \( C_{x}, C_{y} \) : Grid cell의 좌상단 끝의 offset
    • \( p_{w}, p_{h} \) : Anchor Box의 width, height
    • \( b_{x}, b_{y} \) : GT에 가까워지도록 계속해서 학습되는 trained anchor box의 중심 좌표
    • \( t_{x}, t_{y}, t_{w}, t_{h} \) : 5개의 Anchor Boxes 각각의 좌표
      • 학습을 진행하며 \( t_{x}, t_{y}, t_{w}, t_{h} \) 는 GT와의 차이가 0이 되게 수렴되게 됩니다.

 

 

 

 

 

 

 

 

 

 


 

 

Yolo v3

 

Yolov3

 

※ 특징

  • Backbone : Darknet 53 (Darknet 19의 발전된 버전)
  • Grid 당 비율과 크기가 다른 9개의 Anchor Box 사용합니다.

 

https://arxiv.org/ftp/arxiv/papers/1812/1812.10590.pdf
https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/

  • 여러 Scale에서 나온 값을 사용합니다.
    • 작은 Object도 탐지 가능!

 

https://gombru.github.io/2018/05/23/cross_entropy_loss/

  • Softmax는 제일 높은 하나의 클래스 확률 값만 높게 설정해 주기 때문에 Sigmoid → Binary cross entropy (Independent logistic classifiers)를 취해줍니다.
    • input으로 남자 사람의 이미지가 들어갔다고 가정했을때, 만약 Class의 종류 중 'Person'과 'Man'이 있다면 둘 중 하나의 값이 나오게 됩니다. 이 이유는 입력 이미지에는 하나의 클래스만 있을 것이라는 가정을 하기 때문입니다. 그래서 정확하게 예측하기 위해 Independent logistic classifier를 사용해줍니다.
  • Focal Loss 적용하려고 했지만 성능이 저하되서 Focal Loss를 사용하지 않았습니다.

 

 

 

 

 

 

 

 

 

 

출처 : 

 

TN, FN, FP, TN ?

 

 

 


 

 

Precision (정밀도), Recall (재현율)

 

  • 한국어로 정밀도라고 부릅니다.
  • Model이 찾은 모든 객체 중 옳게 검출한 비율 입니다. (Model 시점으로 보면 편할거 같다!)

 

Example)

Model이 5개의 객체를 검출했을때, 옳게 검출한 개수가 4개면

Precision = 4/5 = 0.8 이 됩니다.

 

 

 

 

  • 한국어로 재현율이라고 부릅니다.
  • 실제 모든 객체 중 옳게 검출한 비율 입니다. (정답 시점으로 보면 편할거 같다!)

 

Example)

검출되어야 하는 객체가 10개라고 했을때, Model이 옳게 검출한 개수가 4개면

Recall = 4/10 = 0.4 가 됩니다.

 

 

Precision과 Recall 둘 중 하나만 사용해서 성능을 평가하는건 적절하지 않습니다.

 

또한 위의 Example을 보면 알 수 있듯이 Precision과 Recall 은 반비례의 관계와 비슷하다는 것을 볼 수 있습니다.

 

따라서, Precision과 Recall 두 값을 적절하게 이용하여 성능을 평가해야 합니다.

 

그래서 필요한 것이 Precision-Recall 곡선 및 AP 입니다.

 

 


PR 곡선

모델의 confidence에 대한 threshold 값의 변화에 따라 precision과 recall 값들은 달라질 것입니다.

 

이것을 그래프로 나타낸 것이 바로 PR 곡선입니다.

 

표 1

표 1을 기준으로 예시를 들어보겠습니다.

 

15개의 객체가 존재하는 이미지를 넣어 얻은 결과값이라고 가정을 한다면,

 

TP : 옳게 검출

FP : 틀린 검출

  • Precision : 7/10 = 0.7
  • Recall : 7/15 = 0.47

 

이제 Threshold 를 각각 다른 값으로 적용을 한 표를 보겠습니다.

Threshold 표

위의 표를 보면 Threshold에 따라 Precision과 Recall의 수치가 바뀌는 걸 볼 수 있습니다.

 

 

Threshold에 따른Precision과 Recall 값들을 그래프로 표시한것이 PR 곡선 입니다.

 

 


 

 

AP (Average Precision)

 

PR 곡선은 어떤 알고리즘의 성능을 전반적으로 파악하기에는 좋으나 서로 다른 두 알고리즘의 성능을 정량적으로 비교하기에는 불편한 점이 있습니다.

 

그래서 나온 것이 AP 입니다.

 

보통 계산 전에 PR 곡선을 위의 빨간 점선처럼 살짝 바꿔줍니다. (보간법)

 

위의 경우 AP는 왼쪽의 큰 사각형의 넓이 + 오른쪽 작은 사각형의 넓이로서

 

\( AP = 1 x 0.33 + 0.88 x (0.47 - 0.33) = 0.4532 \) 가 됩니다.

 

 


 

 

mAP (mean Average Precision)

 

mAP는 Class가 여러개인 경우,

 

각 Class의 AP를 구한뒤 평균을 내주는 평가 방법입니다.

 

 

 

 

 

 

출처:

 

 

'Deep Learning > deep learning' 카테고리의 다른 글

06_Loss Function_3_Focal Loss, IoU Loss  (0) 2022.05.11
06_Loss Function_2_Entropy, Binary, Categorical  (0) 2022.05.04
06_Loss Function_1_MAE,MSE,RMSE  (0) 2022.05.03
05_Overfitting, Regularization  (0) 2022.04.18
04_Max Pooling  (0) 2022.04.18

이번에는 Focal Loss, IoU Loss에 대해 알아보겠습니다.

 

 


Focal Loss

 

Object Detection Loss

 

 

Object Detection에는 Localization과 Classification 두가지 절차가 있습니다.

  • Localization : Image에서 객체가 있을 만한 위치를 찾는 것.
  • Classification : 어떤 물체인지 판단하는 것.

 

2 Stage는 Localization (ex : Selective Search, RPN ...) → Classification 순서로 진행이 되고,

 

1 Stage는 Localization과 Classification이 동시에 처리합니다.

 

1 Stage는 2 Stage보다 처리 속도는 빠르지만 정확도면에서는 뒤떨어지는 경향이 있다고 합니다.

(그런데 요즘 1 Stage도 굉장히 좋아져서 잘 모르겠다.)

 

 

1 Stage의 정확도가 떨어지는 이유

  • Anchor Box가 가리키는 Location의 대부분은 학습에 기여하지 않는 Easy Negative 이므로 학습에 비효율적.
  • easy negative 각각의 Loss 값은 작지만 굉장히 많으므로 전체 Loss 및 Gradient를 계산할 때, Easy Neagative의 영향이 압도적으로 커지는 문제가 발생합니다.

 

※ easy negative란??

더보기

  •  Easy Negative  : 실제로 negative 이고 예측도 negative 라고 잘 나오는 예측이 쉬운 데이터
  •  Hard Negative  : 실제로는 negative 인데 positive 라고 잘못 예측하기 쉬운 데이터 

 

Focal Loss는 1 Stage의 정확도가 떨어지는 단점을 보완기 위해 제시된 Loss 입니다.

 

즉, Focal Loss는 Easy Negative와 Hard Negative에 대해 다른 가중치를 부여하는 방법입니다.

 


 

Cross Entropy의 문제점

 

저번 게시글에서 Cross Entropy에 대해 다뤘었습니다.

 

Cross Entropy는 가중치를 다르게 부여한다는 점이 있었는데

 

Focal Loss와 어떤 점이 다른지 보겠습니다.

 

Binary Cross Entropy

 

이진분류를 예로 들면 Cross Entropy Loss 공식은 위와 같습니다.

 

\(Y_{act}\)는 \(Y\), \(Y_{pred}\)는 \(p\)로 표기를 하고

 

\(Y_{act}\)가 1이면 아래와 같은 식이 됩니다.

 

 

만약 \(p\)의 값이 1이면 \(CE(p,y) = 0\) 이 됩니다.

 

즉, 잘 예측했지만 보상은 없고 패널티도 없습니다.

 

반면, \(p\)의 값을 0에 가깝게 예측하게 되면 \(CE(p,y) \) 로 패널티가 엄청 커지게 되는 것입니다.

 

결론적으로 Cross Entropy 는 보상은 없고, 패널티만 부여해주는 Loss Function 로서

 

Easy Negative를 고려하지 않아 Easy Negative 의 영향을 많이 받습니다.

 


 

Focal Loss

 

이번에 알아볼 Focal Loss의 식을 보겠습니다.

 

Focal Loss

 

Focal Loss는 Easy Negative 의 영향을 줄이고 Hard Negative 의 학습에 초점을 맞추는 Cross Entropy의 확장판이라고 할 수 있습니다.

 

Focal Loss 식의 \(\alpha(1-p_{t})^{\gamma}\) 중 \(\alpha\) 와 \(\gamma\) 의 값은 논문에서 각각

 

\(\alpha = 0.25\) , \(\gamma = 2\) 를 최종적으로 사용하였습니다.

 

출처 : https://gaussian37.github.io/dl-concept-focal_loss/

 

x축의 빨간 0.1 (①)Hard Negative 문제이고, 초록색의 0.9 (②)Easy Negative 문제입니다.

 

\(\alpha\)와 \(\gamma\)는 1로 적용 되었습니다.

 

① 에서

\( CE(0.1) = -log(0.1) = 2.30259... \) 이고,

\( FL(0.1) = -(1 - 0.1)log(0.1) = 2.07233... \) 임을 알 수 있습니다.

 

② 에서

\( CE(0.9) = -log(0.9) = 0.105361... \) 이고,

\( FL(0.9) = -(1 - 0.9)log(0.9) = 0.0105361... \) 임을 알 수 있습니다.

 

Hard Negative 보다 Easy Negative의 경우 더 많이 떨어짐을 통하여 기존에 문제가 되었던 수많은 Easy Negative 에 의한 Loss가 누적되는 문제를 개선합니다.

 

결론적으로 Focal Loss는 Cross Entropy 와는 다르게

 

Easy Negative에는 Hard Negative 보다 Loss를 더 크게 낮추는 보상을 해줍니다.

 

 

 

 


 

IoU Loss

 

IoU 란?

 

IoU는 Object Detection에서 Truth Box와 Predict Box의 차이를 나타낼 때 사용합니다.

 

 

그림과 같이 교집합 / 합집합으로 보시면 되겠습니다.

 

IoU 값은 0 ~ 1 사이의 값을 가지고 1로 갈수록 Truth Box에 가깝다는 얘기가 됩니다.

 

IoU Loss

IoU Loss의 식은 위와 같습니다!

 

 

※ IoU 를 Loss에 이용하려는 이유!

 

 

(a) 에서 볼 수 있듯이 MSE 값은 일정하지만 box의 겹침 정도를 나타내는 IoU 값은 변합니다.

  • 왼쪽 하단 거리와 오른쪽 상단 거리가 동일할 때

 

(b) 에서 볼 수 있듯이 MAE 값은 일정하지만 box의 겹침 정도를 나타내는 IoU 값은 변합니다.

  • 중심 사이의 거리와 높이, 너비 차이가 동일할 때

 

 

하지만 IoU를 Loss로 활용할때에도 문제점은 있습니다.

 

3번째 사진에서 보면 어느 정도의 오차로 교집합이 생기지 않은 것인지 파악을 할 수 가 없기 때문입니다.

 

이러한 문제를 해결하기 위해 GIoU Loss 가 등장합니다.

 

 


 

GIoU

 

GIoU

 

GIoU 는 IoU Loss의 문제점을 해결하기 위해서 새로운 Box를 하나 더 만들었습니다.

 

C Box는 A와 B Box를 포함한 가장 작은 Box 입니다.

 

위의 식에서 C\(A ∪ B) 는 C Box 영역에서 A와 B의 영역을 빼준 영역 입니다.

 

GIoU Loss

  • 왼쪽
    • IoU : 0
    • GIoU : 0
  • 오른쪽
    • IoU : 0
    • GIoU : 0.7

위와 같이 구분이 가능합니다.

 

 

GIoU의 단점

 

 

초록색 : Ground Truth Box

검은색 : 기존 Anchor Box

파란색 : Predicted Box

  • GIoU Loss 사용에 따른 진행 방식이 너무 느림.
    1. 기존 AB 에서 GT 를 찾기 위해 PB 의 영역을 점점 넓혀 갑니다.
    2. GT 와의 겹치는 부분이 생기면 IoU 값을 높이기 위해 PB의 크기를 줄이며 점점 GT에 가까워 지게 됩니다.

 

 

 

 

 

초록색 : Ground Truth Box

빨간색 : Predicted Box

  • PBGB 안에 있으면 값이 일정합니다.

 

요약하자면 수렴속도가 느리고, PB가 GB 안에 있으면 값이 Update 되지 않습니다.

 

 


 

DIoU

 

GIoU 의 문제점을 개선한 DIoU가 나왔습니다.

 

GIoU 가 PB의 영역을 넓히면서 학습되는 반면에

 

DIoU 는 GT와 PB의 중심점을 고려하여 학습을 진행합니다.

 

DIoU

  • \( \rho \) : Euclidean distance
  • \( b \) : PB의 중심
  • \( b^{gt} \) : GT의 중심
  • \( c^{2} \) : CB의 대각 길이

 

 


 

CIoU

 

CIoU는 DIoU가 제안 된 논문에서 같이 제안된 방법 입니다.

 

CIoU는 DIoU에서 aspect ratio (종횡비)를 고려한 Loss 입니다.

 

CIoU

 

  • \( \upsilon \) : 두 Box의 aspect ratio (종횡비)의 일치성을 측정하는 역할.
  • \( \alpha \) : non-overlapping case와 overlapping case의 균형을 조절하는 역할.

 

다음에는 어떤걸 알아볼까...

 

 

 

 

 

 

출처 : 

 

 

저번 게시글에서는 MAE, MSE, RMSE 에 대해 올렸습니다.

 

이번 게시글은 그 외 다른 Loss Function 입니다.

 

그 전에 Entropy 먼저 살펴보겠습니다.

 

※ 참고로 아래 글에서 쓰일 \(log\)는 밑이 자연상수인 자연로그 입니다.

 


 

1. Entropy

 

Entropy는 불확실성의 척도로 정보이론에서의 Entorpy는 불확실성을 나타내며

 

Entropy가 높다는 것은 불확실성이 높고, 정보가 많다는 것을 의미 (매우 놀라운 사건).

Entropy가 낮다는 것은 불확실성이 낮고, 정보가 적다는 것을 의미 (흔히 일어나는 사건).

 

여기서 불확실성은 어떤 데이터가 나올지 예측하기 어려운 경우입니다.

 

Entropy

여기서, \(p(x_i)\) 와 \(logp(x_i)\) 의 의미를 보겠습니다.

  • \(log(\frac{1}{p(x_i)})\) : 정보량
  • \(p(x_i)\) : 그 정보가 나올 확률

Shannon Entropy에서는 \( log_2 \) 로 쓰던데 여기서는 밑을 \( e \) 로 합니다.

 

Example)

 

※ 동전 던지기& 주사위 던지기

  • 동전을 던졌을 때, 앞/뒷면이 나올 확율은 각각 1/2 입니다.
  • 주사위는 각 6면이 나올 확률은 모두 1/6 입니다.

위: 동전, 아래: 주사위

위의 식을 계산하면

 

동전의 경우 0.693, 주사위의 경우 1.79가 나오게 됩니다.

 

즉, 주사위의 Entropy가 더 높습니다.

 

※ 중요) \( log(\frac{1}{p(x_i)}) \) 가 정보량인 이유! ※

더보기

기대값

기대값의 예시를 들어보겠습니다.

 

주사위를 던졌을 때 생각해보면 1 ~ 6 까지의 숫자가 나오고 각각 확률은 같습니다.

 

그렇다면 주사위를 던졌을 때의 기대값은 아래와 같습니다.

 

주사위의 기대값

 

즉, 데이터의 정보확률을 곱해주는 것입니다.

 


 

자 그러면 여기서 기대값의 식과 Entorpy의 식을 비교해보겠습니다.

 

위 : 기대값, 아래 : Entropy

 

\( x_i \) 와 \( log_2(\frac{1}{p_i}) \) 를 제외하면 전부다 동일합니다.

 

즉, Entropy는 기대값의 식과 동일한 Format을 가지게 됩니다.

 

\( x_i \) 는 정보량이므로 \( log_2(\frac{1}{p_i}) \) 도 정보량이라고 볼 수 있습니다.

 

더욱 자세한건 허민석 님의 유튜브를 참고!

 

https://www.youtube.com/watch?v=CdH7U3IjRI8

 


 

 

2. Cross-Entropy

 

Cross-Entropy는 예측값이 정답값과 얼마나 근사한지를 볼 수 있는 척도 입니다.

 

예측한 정보량을 실제 확률에 곱하게 됩니다!

 

Cross-Entropy

  • \( p(x) \) : 예측 확률
  • \( log\frac{1}{p(x_i)} \) : 예측값의 정보량
  • \( q(x) \) : 실제 데이터값의 확률

 

학습이 잘되고 있다면 Cross-Entropy 값은 정답의 Entropy 값에 가까워 집니다.

 

그러므로 Cross-Entropy 의 값은 Entropy의 값보다 크거나 같습니다.

 

 

Example)

 

실제로 가방에는 아래와 같은 확률로 3가지 색의 공이 들어있습니다.

  • 빨간 공 : 0.8
  • 초록 공 : 0.1
  • 노랑 공 : 0.1

하지만 예측값

  • 빨간 공 : 0.2
  • 초록 공 : 0.2
  • 노랑 공 : 0.6

그렇다면 Entropy와 Cross-Entropy는 아래와 같이 계산이 됩니다.

 

Cross-Entropy

 

※ KL Divergence ( Kullback Leibler Divergence )

더보기

KL Divergence는 두 개의 서로 다른 확률 분포를 비교하는 방법입니다.

 

KL Divergence
  • \( p_i \) : 예측 확률 분포
  • \( q_i \) : 실제 확률 분포

 

위의 식은 KL Divergence 입니다.

 

식을 보면 KL Divergence에 Cross-Entropy의 내용이 포함되어 있습니다.

 

Entropy(q)는 결국 상수값이므로

 

즉, KL Divergence를 최소화 시키기 위해서는 결국 Cross-Entropy를 최소화 시켜야 합니다.


 

 


Binary Cross Entropy

 

Binary Cross Entropy는 이진분류를 수행할때 사용되는 Loss Function 으로

 

sigmoid activation의 Output 값을 이용합니다.

 

즉, 참 or 거짓 경우의 수가 2가지인 경우 입니다.

 

이러한 기능을 해주는 것이 \( log \) 입니다.

 

정답값이 1이라고 했을때 \(x\)값이 1로 다가갈때 값이 감소하는 \( -log \) 를 사용하고,

 

정답값이 0이라고 했을때 \(x\)값이 0으로 다가갈때 값이 감소하는 \( -log(1-x) \) 를 사용하면 됩니다.

 

위의 두가지 경우를 모두 만족시키는 식을 만들어보면 아래와 같이 이루어집니다.

 

 

아래는 Cross Entropy에서 유도한 식입니다.

Binary Cross Entropy 유도

 

 

 


Categorical Cross-Entropy

 

Categorical Cross-Entropy는 분류해야할 Class가 3개 이상인 경우,

 

즉, Multi Class 분류에 사용됩니다.

 

널리 쓰이는 프레임워크 3가지에서는 multi-class에서 쓸 수 있는 cross entropy loss를 정의해놓았습니다.


물론 이는 binary class에서도 적용이 가능합니다. 클래스가 2개일 때 sigmoid와 softmax는 같은 식이 됩니다.

  • Caffe : SoftmaxWithLoss Layer
  • Pytorch : torch.nn.CrossEntropyLoss
  • TensorFlow : tf.nn.softmax_cross_entropy (deprecated) → tf.nn.softmax_cross_entropy_v2

 

보통 softmax 후에 Cross-Entropy를 적용해줘야 하지만,

 

Pytorch의 torch.nn.CrossEntropyLoss 안에 softmax가 포함되어 있습니다.

 

아래 접은 글을 보면 Cross Entropy Loss가 가중치를 다르게 주어지는걸 알 수 있습니다.

 

※ softmax

더보기

sofrmax

만약 총 Class의 수가 3개면

  • softmax를 사용하게 되면 벡터를 합이 1이 되는 확률값으로 변환해준다!
  • 값이 조금만 변하여도 출력은 크게 변한다!

 

Example)

학생으로 이루어진 집단 A가 있다. 이 집단은 초등학생 1명, 중학생 1명, 고등학생 3명으로

A(1, 1, 3) 인 집단이다.

이 중 임의로 한명을 콕 집었을 때 그 학생이 초등학생, 중학생, 고등학생일 확률을 각각 구하여라.

  • 초등학생 수 : es
  • 중학생 수 : ms
  • 고등학생 수 : hs

Case 1) 일반적인 확률

Case 2) softmax

이걸로 알 수 있듯이 큰 값의 가중치를 크게 부여 한다는 것을 알 수 있습니다!

 

또한, 값을 변화시켰을 때도 softmax에서 더 두드러지게 표현됩니다.

 

 

 

https://toyourlight.tistory.com/16

https://syj9700.tistory.com/38


 

 

 

 

 

 

출처 :

 

 

softmax : 

 

'Deep Learning > deep learning' 카테고리의 다른 글

07_성능 평가 방법 AP (Average Precision)  (0) 2022.05.12
06_Loss Function_3_Focal Loss, IoU Loss  (0) 2022.05.11
06_Loss Function_1_MAE,MSE,RMSE  (0) 2022.05.03
05_Overfitting, Regularization  (0) 2022.04.18
04_Max Pooling  (0) 2022.04.18

+ Recent posts