root@bskyvision: ~#
방명록
태그
RSS

<닫기>

3,585,190/3,798/394

프로필사진
수많은 소음 속에서 신호를 찾아가는 bskyvision입니다.


<닫기>

  • leon_choi이(가) 08.10에 작성한 댓글: 멋쟁이.
  • 꼬장이이(가) 07.25에 작성한 댓글: test.

<닫기>

(전체 글) 검색 결과 861건
  • [CNN 알고리즘들] VGGNet의 구조 (VGG16) (3)
    LeNet-5 => https://bskyvision.com/418 AlexNet => https://bskyvision.com/421 VGG-F, VGG-M, VGG-S => https://bskyvision.com/420 VGG-16, VGG-19 => https://bskyvision.com/504 GoogLeNet(inception v1) => https://bskyvision.com/539 ResNet => https://bskyvision.com/644 SENet => https://bskyvision.com/640 CNN 알고리즘들 중에서 이미지 분류용 알고리즘에 대해서 계속해서 포스팅을 하고 있다. 현재까지 LeNet-5, AlexNet, VGG-F, VGG-M, VGG-S에 대해 소개했었..
  • [CNN 알고리즘들] VGG-F, VGG-M, VGG-S의 구조 (2)
    LeNet-5 => https://bskyvision.com/418 AlexNet => https://bskyvision.com/421 VGG-F, VGG-M, VGG-S => https://bskyvision.com/420 VGG-16, VGG-19 => https://bskyvision.com/504 GoogLeNet(inception v1) => https://bskyvision.com/539 ResNet => https://bskyvision.com/644 SENet => https://bskyvision.com/640 ----- 컨볼루션 신경망(CNN)은 딥러닝 알고리즘 중에 컴퓨터 비전 분야에서 절대 강자로 군림하고 있다. CNN 알고리즘 중 LeNet-5와 AlexNet에 대해서는 이미 소개..
  • 공부/선형대수학 - 2019.06.25
    [선형대수학] 가우스-요르단 소거법으로 n차 정방행렬의 역행렬 구하기
    2차 정방행렬(정사각형행렬)의 역행렬을 구하는 법은 고등학교 수학과정을 배운 사람이라면 모두 다 알 것이다. 다음과 같은 2차 정방행렬이 있다. $A = \begin{bmatrix} 1 & 2\\ 3 & 4 \end{bmatrix}$ 이 행렬의 역행렬은 다음과 같다. $A^{-1} = -\frac{1}{2}\begin{bmatrix} 4 & -2\\ -3 & 1 \end{bmatrix}$ 방금 나는 아래 공식에 따라 역행렬을 구했다. 아마 익숙한 공식일 것이다. 그런데 이 공식은 2차 정방행렬에만 적용될 수 있다. 만약 정방행렬의 차수가 3차, 4차,..., n차라면 역행렬을 어떤 방식으로 구할 수 있을까? 오늘은 바로 그에 대한 해결책에 대해 살펴보려고 한다. 가우스-요르단 소거법으로 n차 정방행렬의 ..
  • [LaTeX] 표 만들기 관련 좋은 글 링크
    LaTeX(레이텍이라 발음한다)은 논문을 쓰는데 있어서 거의 필수적인 도구다. 지금까지 SCI논문이나 컨퍼런스 논문을 쓸 때 LaTeX을 이용하지 않은 논문은 단 한편도 없다. LaTex을 이용해서 논문의 원고를 작성할 때 기본적으로 텍스트를 작성하고 그림을 첨부하는 과정은 그다지 어렵지 않다. 조금만 살펴보면 어떻게 사용하는지 금방 알 수 있다. 하지만 표(table)의 경우에는 원하는 형식으로 만드는 것이 어렵다. 나도 처음에 표 때문에 굉장히 고생했다. 아래 링크는 LaTeX에서 표 만들기에 관한 글인데 좋은 정보들을 담고 있다. => http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzI0NzIwQGZzMy50aXN0b3J5LmN..
  • 공부/선형대수학 - 2019.06.24
    [선형대수학] 두 행렬의 곱을 바라보는 세 가지 관점 (6)
    선형대수학 관련해서 오랜만에 포스팅을 합니다. 선형대수학은 영상처리 및 컴퓨터비전 분야를 연구하면 할수록 중요한 과목이라는 사실을 깨닫게 됩니다. 이미지를 행렬로 표현할 수 있고, 이미지에 어떠한 처리를 가하는 것은 결국 행렬의 연산이기 때문입니다. 오늘은 두 행렬의 곱에 대해 글을 쓰려고 합니다. 고등학교때 처음 행렬(matrix)에 대해 배웠을 때, 두 행렬의 곱을 구하는 방법은 단 한가지였다. 두 행렬의 곱을 바라보는 관점1: "행렬A와 행렬B를 곱한 결과 생성된 행렬AB의 (i, j) 요소는 행렬A의 i번째 행(row)과 행렬B의 j번째 열(column)을 곱한 것이다." 지금이야 이 방식을 이처럼 말로 표현할 수 있지만(매우 설명이 난해하긴 하지만), 그 당시만 해도 그냥 막연히 푸는 방법만 알..
  • 스킨을 바꿨습니다(앰원리액트)
    오늘 스킨을 앰원리액트(M1react)로 교체했습니다. 교체 이유는 다음과 같습니다. 1) 2단 형식의 반응형 스킨을 사용하고 싶었습니다. 글, 카테고리, 블로그 설명 등이 한 눈에 보이는 것을 좋아해서요.^^ 2) 좀 더 깔끔하고 예쁜 스킨을 사용하고 싶은 향한 갈망이 있었습니다. 교체하느라 이것저것 손봤는데 오늘 bskyvision.com을 방문하시고 글을 보시던 분들께는 혼란을 야기했을 것 같아 죄송하네요..^^; 이제는 웬만해선 스킨을 안 바꾸려고 합니다. 이 스킨을 사용하시고 싶은 분들께는 아래 링크들이 도움이 되실 것입니다. https://m1story.tistory.com/71 => 앰원리액트 스킨 다운로드 https://m1story.tistory.com/72 => 앰원리액트 스킨 설치 및..
  • 코딩/matlab - 2019.06.14
    [MATLAB] 표준화된 z-점수 산출하기, zscore 함수
    MATLAB의 zscore 함수를 설명하기 전에 먼저 zscore 함수가 어떤 상황에 사용될 수 있는가를 먼저 예를 통해서 살펴보려고 한다. 10명의 중학생이 있다. 이들의 수학, 영어, 국어, 과학 시험 점수는 다음과 같다. 나는 이 학생들이 이과 쪽이 적성에 맞을지, 문과 쪽이 적성에 맞을지 한명 한명 판단하고 싶다. 수학과 과학 점수가 좋다면 이과로 진학하는 것이 좋을 것이고, 영어와 국어 점수가 좋다면 문과로 진학하는 것이 좋을 것이다. 하지만 각 과목당 시험의 난이도가 다르기 때문에 단순히 점수만을 봐서는 이 학생이 어느 과목을 더 잘하는지 제대로 판단하기 어렵다. 그래서 수학, 영어, 국어, 과학 점수를 각각 표준화(standardization)해준다. 표준화라는 것은 원래 값에 평균값을 빼준..
  • 공부/확률, 통계 - 2019.06.03
    자료를 대표하는 숫자, 대표값: 평균, 중앙값, 최빈값
    오늘 포스팅하는 대표값은 예전에 중국 칭화대학교의 신호처리 Lab에 석사를 지원했을 때, 면접 중에 교수님들이 내게 물어봤던 것이다. "평균, 중앙값이 뭐죠? 또 C언어로 코딩한다면 어떻게 코딩해야할까요?" 그 당시에 나는 이 질문에 제대로 답변을 못했다. 중앙값에 대한 이해가 없었다. 당연히 중앙값에 대해서는 코드를 작성할 수도 없었다. 그리고 얼마 지나지 않아 불합격 소식을 듣게 되었다. 그 덕분(?)에 나는 지금 이 톈진대학교에 오게 되었다. 이곳에서 그간 많이 성장해왔으니 감사하게 생각하고 있다. 그만큼 대표값이라는 개념은 통계에 있어서 매우 기본 중의 기본이다. 그 당시에 나는 통계학에 있어서는 정말 기본도 몰랐던 것이다. 통계학은 어떤 전공을 막론하고 필수과목이 되어가고 있다. 혹시 나처럼 어..
  • semantic segmentation의 목적과 대표 알고리즘 FCN의 원리 (16)
    요즘 semantic segmentation을 활용하는 연구를 하나 진행하고 있다. semantic segmentation, 이름만 봐서는 이것이 무엇인지 감이 안오는 분들이 있을 것이다. 구지 번역하자면 '의미적 분할' 정도로 번역이 가능할 것 같다. 간단히 이야기해서 이미지를 의미있게 분할하는 것이 바로 semantic segmentation이다. 이 글을 차근히 읽어나가면 확실하게 알 수 있을 것이다. 인내하고 끝까지 읽는 자에게 복이 있나니...^^ 오늘 이 글에서는 semantic segmentation의 목적이 무엇인지, 어디에 적용될 수 있는지, 그리고 대표적인 알고리즘인 FCN(fully convolutional networks)의 원리는 무엇인지에 대해서 소개하려고 한다. Semantic..
  • 공부/확률, 통계 - 2019.05.16
    모평균의 신뢰구간 추정하기 (27)
    신뢰구간 추정에 대해 '언젠가 정리해야지 정리해야지' 미루다가 드디어 정리하게 되었다. 모호했던 개념들을 제대로 잡아보자. 신뢰구간이란? 추정에는 점추정(point estimation)과 구간추정(interval estimation)이 있다. 점추정은 모수가 얼마일 것이라고 하나의 수치를 추정하는 것이다. 여기서 모수는 모평균, 모분산, 모표준변차, 모비율 등 모집단의 특성에 관한 수치들을 의미한다. 구간추정은 모수가 어느 값 a와 어느 값 b 사이, 즉 어떤 구간 내에 몇 %의 확률로 존재할 것이라고 추정하는 것이다(엄밀히 따지면 정확한 의미는 아니지만, 이렇게 받아들이는 것이 이해하기 쉽다[4]). 그 확률을 신뢰수준(confidence level) 또는 신뢰도라고 부르고, 그 추정한 구간을 신뢰구간..
2019-06-28 15:38:41

LeNet-5 => https://bskyvision.com/418

AlexNet => https://bskyvision.com/421

VGG-F, VGG-M, VGG-S => https://bskyvision.com/420

VGG-16, VGG-19 => https://bskyvision.com/504

GoogLeNet(inception v1) => https://bskyvision.com/539

ResNet => https://bskyvision.com/644

SENet => https://bskyvision.com/640

 

 

CNN 알고리즘들 중에서 이미지 분류용 알고리즘에 대해서 계속해서 포스팅을 하고 있다. 현재까지 LeNet-5, AlexNet, VGG-F, VGG-M, VGG-S에 대해 소개했었다. 

 

오늘은 VGGNet에 대해서 글을 쓰려고 한다. VGGNet은 옥스포드 대학의 연구팀 VGG에 의해 개발된 모델로써, 2014년 이미지넷 이미지 인식 대회에서 준우승을 한 모델이다. 여기서 말하는 VGGNet은 16개 또는 19개의 층으로 구성된 모델을 의미한다(VGG16, VGG19로 불림). 이전에 포스팅한 VGG-F, VGG-M, VGG-S와는 차이가 있다. 그 모델들은 8개의 층을 가진 AlexNet과 유사한 모델들이다. 하지만 AlexNet와 같이 병렬적 구조로 이뤄지진 않았다. 

 

역사적으로 봤을 때 VGGNet 모델부터 시작해서 네트워크의 깊이가 확 깊어졌다. 아래 그림을 참고하자. 

 

네트워크의 깊이 변화에 따른 top-5 error의 변화 [1]

2012년, 2013년 우승 모델들은 8개의 층으로 구성되었었다. 반면 2014년의 VGGNet(VGG19)는 19층으로 구성되었고, 또한 GoogLeNet은 22층으로 구성되었다. 그리고 2015년에 이르러서는 152개의 층으로 구성된 ResNet이 제안되었다. 네크워크가 깊어질 수록 성능이 좋아졌음을 위 그림을 통해 확인할 수 있다. VGGNet은 사용하기 쉬운 구조와 좋은 성능 덕분에 그 대회에서 우승을 거둔 조금 더 복잡한 형태의 GoogLeNet보다 더 인기를 얻었다. 

 

자, 그러면 VGGNet은 이전 모델들과 비교해서 어떤 점이 있는지 살펴보도록 하자. 이 VGGNet의 original 논문은 Karen Simonyan과 Andrew Zisserman에 의해 2015 ICLR에 게재된 "Very deep convolutional networks for large-scale image recognition"이다. 

 

 

 

VGGNet의 구조

VGGNet의 original 논문의 개요에서 밝히고 있듯이 이 연구의 핵심은 네트워크의 깊이를 깊게 만드는 것이 성능에 어떤 영향을 미치는지를 확인하고자 한 것이다. VGG 연구팀은 깊이의 영향만을 최대한 확인하고자 컨볼루션 필터커널의 사이즈는 가장 작은 3 x 3으로 고정했다.

 

개인적으로 나는 모든 필터 커널의 사이즈를 3 x 3으로 설정했기 때문에 네트워크의 깊이를 깊게 만들 수 있다고 생각한다. 왜냐하면 필터커널의 사이즈가 크면 그만큼 이미지의 사이즈가 금방 축소되기 때문에 네트워크의 깊이를 충분히 깊게 만들기 불가능하기 때문이다. 

 

VGG 연구팀은 original 논문에서 총 6개의 구조(A, A-LRN, B, C, D, E)를 만들어 성능을 비교했다. 여러 구조를 만든 이유는 기본적으로 깊이의 따른 성능 변화를 비교하기 위함이다. 이중 D 구조가 VGG16이고 E 구조가 VGG19라고 보면 된다. 

 

VGGNet 구조 설명 표 [출처: original 논문]

 

VGG 연구팀은 AlexNet과 VGG-F, VGG-M, VGG-S에서 사용되던 Local Response Normalization(LRN)이 A 구조와 A-LRN 구조의 성능을 비교함으로 성능 향상에 별로 효과가 없다고 실험을 통해 확인했다. 그래서 더 깊은 B, C, D, E 구조에는 LRN을 적용하지 않는다고 논문에서 밝혔다. 또한 그들은 깊이가 11층, 13층, 16층, 19층으로 깊어지면서 분류 에러가 감소하는 것을 관찰했다. 즉, 깊어질수록 성능이 좋아진다는 것이었다. 

 

VGGNet의 구조를 깊이 들여다보기에 앞서 먼저 집고 넘어가야할 것이 있다. 그것은 바로 3 x 3 필터로 두 차례 컨볼루션을 하는 것과 5 x 5 필터로 한 번 컨볼루션을 하는 것이 결과적으로 동일한 사이즈의 특성맵을 산출한다는 것이다(아래 그림 참고). 3 x 3 필터로 세 차례 컨볼루션 하는 것은 7 x 7 필터로 한 번 컨볼루션 하는 것과 대응된다.

 

 

그러면 3 x 3 필터로 세 차례 컨볼루션을 하는 것이 7 x 7 필터로 한 번 컨볼루션하는 것보다 나은 점은 무엇일까? 일단 가중치 또는 파라미터의 갯수의 차이다. 3 x 3 필터가 3개면 총 27개의 가중치를 갖는다. 반면 7 x 7 필터는 49개의 가중치를 갖는다. CNN에서 가중치는 모두 훈련이 필요한 것들이므로, 가중치가 적다는 것은 그만큼 훈련시켜야할 것의 갯수가 작아진다. 따라서 학습의 속도가 빨라진다. 동시에 층의 갯수가 늘어나면서 특성에 비선형성을 더 증가시키기 때문에 특성이 점점 더 유용해진다. 

 

VGG16 구조 분석

그러면 이제 VGG16(D 구조)를 예시로, 각 층마다 어떻게 특성맵이 생성되고 변화되는지 자세하게 살펴보자. 아래 구조도와 함께 각 층의 세부사항을 읽어나가면 이해하기가 그렇게 어렵지 않을 것이다. 

 

VGG16 구조 [6]

 

0) 인풋: 224 x 224 x 3 이미지(224 x 224 RGB 이미지)를 입력받을 수 있다.

 

1) 1층(conv1_1): 64개의 3 x 3 x 3 필터커널로 입력이미지를 컨볼루션해준다. zero padding은 1만큼 해줬고, 컨볼루션 보폭(stride)는 1로 설정해준다. zero padding과 컨볼루션 stride에 대한 설정은 모든 컨볼루션층에서 모두 동일하니 다음 층부터는 설명을 생략하겠다. 결과적으로 64장의 224 x 224 특성맵(224 x 224 x 64)들이 생성된다. 활성화시키기 위해 ReLU 함수가 적용된다. ReLU함수는 마지막 16층을 제외하고는 항상 적용되니 이 또한 다음 층부터는 설명을 생략하겠다. 

 

2) 2층(conv1_2): 64개의 3 x 3 x 64 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 64장의 224 x 224 특성맵들(224 x 224 x 64)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용함으로 특성맵의 사이즈를 112 x 112 x 64로 줄인다. 

 

*conv1_1, conv1_2와 conv2_1, conv2_2등으로 표현한 이유는 해상도를 줄여주는 최대 풀링 전까지의 층등을 한 모듈로 볼 수 있기 때문이다.  

 

3) 3층(conv2_1): 128개의 3 x 3 x 64 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 128장의 112 x 112 특성맵들(112 x 112 x 128)이 산출된다. 

 

4) 4층(conv2_2): 128개의 3 x 3 x 128 필터커널로 특성맵을 컨볼루션해준다. 결과적으로 128장의 112 x 112 특성맵들(112 x 112 x 128)이 산출된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용해준다. 특성맵의 사이즈가 56 x 56 x 128로 줄어들었다.

 

5) 5층(conv3_1): 256개의 3 x 3 x 128 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 

 

6) 6층(conv3_2): 256개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 

 

7) 7층(conv3_3): 256개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 256장의 56 x 56 특성맵들(56 x 56 x 256)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 28 x 28 x 256으로 줄어들었다. 

 

8) 8층(conv4_1): 512개의 3 x 3 x 256 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 

 

9) 9층(conv4_2): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 

 

10) 10층(conv4_3): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 28 x 28 특성맵들(28 x 28 x 512)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 14 x 14 x 512로 줄어든다.

 

11) 11층(conv5_1): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다.

 

12) 12층(conv5_2): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다.

 

13) 13층(conv5-3): 512개의 3 x 3 x 512 필터커널로 특성맵을 컨볼루션한다. 결과적으로 512장의 14 x 14 특성맵들(14 x 14 x 512)이 생성된다. 그 다음에 2 x 2 최대 풀링을 stride 2로 적용한다. 특성맵의 사이즈가 7 x 7 x 512로 줄어든다.

 

14) 14층(fc1): 7 x 7 x 512의 특성맵을 flatten 해준다. flatten이라는 것은 전 층의 출력을 받아서 단순히 1차원의 벡터로 펼쳐주는 것을 의미한다. 결과적으로 7 x 7 x 512 = 25088개의 뉴런이 되고, fc1층의 4096개의 뉴런과 fully connected 된다. 훈련시 dropout이 적용된다.

(이 부분을 제대로 이해할 수 있도록 지적해주신 jaist님과 hiska님께 감사드립니다.^^)

 

15) 15층(fc2): 4096개의 뉴런으로 구성해준다. fc1층의 4096개의 뉴런과 fully connected 된다. 훈련시 dropout이 적용된다. 

 

16) 16층(fc3): 1000개의 뉴런으로 구성된다. fc2층의 4096개의 뉴런과 fully connected된다. 출력값들은 softmax 함수로 활성화된다. 1000개의 뉴런으로 구성되었다는 것은 1000개의 클래스로 분류하는 목적으로 만들어진 네트워크란 뜻이다. 

 

 

이미지 분류용 CNN 모델의 발전 과정을 추적해가는 과정이 꽤 흥미롭네요. 질문 있으시면 댓글로 남겨주세요. 혹시 제 이해가 잘못된 부분 있다면 지적 부탁드립니다. 

 

참고자료

[1] https://laonple.blog.me/220738560542, 라온피플, VGGNet[1]
[2] https://laonple.blog.me/220749876381, 라온피플, VGGNet[2]
[3] https://reniew.github.io/08/, reniew's blog, Modern CNN
[4] https://cv-tricks.com/cnn/understand-resnet-alexnet-vgg-inception/, KOUSTUBH, "ResNet, AlexNet, VGGNet, Inception: Understanding various architectures of Convolutional Networks"

[5] http://www.vlfeat.org/matconvnet/models/imagenet-vgg-verydeep-16.svg

[6] https://neurohive.io/en/popular-networks/vgg16/, Neurohive, "VGG16 - Convolutional Network for Classification and Detection"

[7] https://missinglink.ai/guides/convolutional-neural-networks/fully-connected-layers-convolutional-neural-networks-complete-guide/, missinglink.ai, "Fully Connected Layers in Convolutional Neural Networks: The Complete Guide"

 

 

(본문 내 쿠팡 파트너스 링크를 통해 물건을 구입하시면, 제게 소정의 수익이 생겨 더 좋은 글을 작성할 동기부여가 됩니다.)

  1. 질문이(가) 2021.01.01 13:26에 작성한 댓글:
    개인적으로 나는 모든 필터 커널의 사이즈를 3 x 3으로 설정했기 때문에 네트워크의 깊이를 깊게 만들 수 있다고 생각한다. 왜냐하면 필터커널의 사이즈가 크면 그만큼 이미지의 사이즈가 금방 축소되기 때문에 네트워크의 깊이를 충분히 깊게 만들기 불가능하기 때문이다.

    이미지의 사이즈가 축소되는 점은 패딩 기법을 통해 해결할 수 있지 않을까요~??
      주소   수정/삭제   답글
  2. 익명이(가) 2021.08.29 16:17에 작성한 댓글:
이름
비밀번호
홈페이지
비밀여부

LeNet-5 => https://bskyvision.com/418

AlexNet => https://bskyvision.com/421

VGG-F, VGG-M, VGG-S => https://bskyvision.com/420

VGG-16, VGG-19 => https://bskyvision.com/504

GoogLeNet(inception v1) => https://bskyvision.com/539

ResNet => https://bskyvision.com/644

SENet => https://bskyvision.com/640

 

-----

 

컨볼루션 신경망(CNN)은 딥러닝 알고리즘 중에 컴퓨터 비전 분야에서 절대 강자로 군림하고 있다. CNN 알고리즘 중 LeNet-5AlexNet에 대해서는 이미 소개했다. 

 

옥스포드 대학의 연구팀 VGG에 의해 개발된 VGGNet은 2014년 이미지넷 이미지 인식 대회(ILSVRC)에서 준우승했다. 준우승한 모델이긴 하지만 오히려 우승한 모델인 GoogLeNet보다 더 각광받았다. 이 VGGNet부터 네트워크의 깊이가 확 깊어지기 시작했다. 여기서 말하는 VGGNet은 VGG16, VGG19와 같은 모델들이다. 

 

그러나 옥스포드 대학의 VGG팀은 VGG16, VGG19를 개발하기 전에, 먼저 AlexNet과 거의 유사한 CNN 모델들을 개발했었다. VGG-F, VGG-M, VGG-S로 불리는 모델들이다. 오늘은 바로 그 모델들에 대해서 정리하고자 한다. VGG16, VGG19에 대해서는 머지 않은 시일 내에 포스팅할 것이다. 

 

VGG-F, VGG-M, VGG-S 모델을 담고 있는 original 논문의 제목은 "Return of the Devil in the Details: Delving Deep into Convolutional Nets"이다. 2014년에 게재되었다. 

 

VGG-F, VGG-M, VGG-S의 구조

VGG-F, VGG-M, VGG-S는 속도와 정확도의 트레이드오프를 고려한 모델들이다. VGG-F는 fast, 즉 빠름에 초점을 맞춘 모델이고, VGG-S는 slow, 즉 느리지만 정확도에 초점을 맞춘 모델이다. VGG-M은 medium으로 이 둘의 중간 정도라고 보면 된다. VGG-F, VGG-M, VGG-S의 세부적 내용은 다음 표에서 잘 설명하고 있다.

 

VGG-F, VGG-M, VGG-S 구조 설명표 [출처: original paper].

 

VGG-F, VGG-M, VGG-S는 표에서 알 수 있듯이 5층의 컨볼루션 층들과 3층의 fully-connected 층들로 구성되어 있다. 이 글에서는 VGG-F를 중점으로 설명하려고 한다. VGG-F에 대한 설명을 잘 읽고나면 VGG-M과 VGG-S도 충분히 이해할 수 있을 것이라 생각한다. 

 

0) 인풋: VGG-F는 224 x 224 x 3 사이즈의 이미지(224 x 224의 RGB 컬러이미지)를 입력받을 수 있다.

 

1) 첫번째 레이어(컨볼루션 레이어, conv1): 64개의 11 x 11 x 3 사이즈 필터커널로 입력영상을 컨볼루션해준다. 이때 컨볼루션의 보폭(stride)은 4로 설정해주고, zero-padding은 사용하지 않는다. zero-padding이란 컨볼루션시 영상의 가장자리 부분에 0을 추가하여 가장자리에 있는 정보의 손실을 줄이는 것이다. 결과적으로 54 x 54 사이즈의 64장의 특성맵이 산출된다. 컨볼루션으로 산출되는 특성맵의 크기를 계산하는 방법과 관련해서는 아래 따로 설명해놓았다. ReLU 활성화 함수로 특성맵은 활성화된다. 그 다음에는 LRN(local response normalization)을 시행한다. 그 다음에 최대 풀링(max pooling)을 적용하여 2만큼 다운샘플링(downsampling)해준다. 그 결과 64장의 특성맵의 사이즈가 27 x 27로 줄어든다. 참고로 ReLU 활성화 함수 및 LRN에 대한 설명은 AlexNet 포스팅에서 찾아볼 수 있다. 

 

2) 두번째 레이어(컨볼루션 레이어, conv2): 256개의 5 x 5 x 64 사이즈 필터커널로 특성맵을 컨볼루션해준다. (전 층에서 생성된 64장의 특성맵을 입체적으로 겹쳐놓고 5 x 5 x 64 사이즈의 3차원 입체 필터커널로 컨볼루션해준다는 뜻이다.) 컨볼루션 보폭은 1로 설정하고, zero-padding은 2만큼 해준다. 결과적으로 27 x 27 사이즈의 256장의 특성맵이 산출된다. 역시 ReLU 활성화 함수를 적용한 후, LRN을 적용한다. 그 다음에 최대 풀링을 이용해서 2만큼 다운샘플링 해준다. 따라서 256장의 27 x 27 사이즈의 특성맵이 13 x 13으로 작아진다. 

 

3) 세번째 레이어(컨볼루션 레이어, conv3): 256개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 

 

4) 네번째 레이어(컨볼루션 레이어, conv4): 256개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 

 

5) 다섯번째 레이어(컨볼루션 레이어, conv5): 256개의 3 x 3 x 256 사이즈 필터커널로 특성맵을 컨볼루션해준다. 컨볼루션 보폭은 1로 설정하고, zero-padding은 1만큼 해준다. 결과적으로 13 x 13 사이즈의 256장의 특성맵이 산출된다. ReLU활성화 함수를 적용한다. 그 다음에 최대 풀링을 이용해서 2만큼 다운샘플링 해준다. 256장의 13 x 13 사이즈의 특성맵이 6 x 6으로 작아진다. 

 

6) 여섯번째 레이어(fully-connected 레이어, full6): 전 층에서 생성된 6 x 6 x 256의 특성맵을 flatten 해준다. flatten이란 전 층의 아웃풋을 1차원의 벡터로 펼쳐주는 것을 의미한다. 따라서 6 x 6 x 256 = 9216개의 뉴런이 되고 full6층의 4096개 뉴런과 fully connected된다. 4096개의 뉴런으로 출력된 것을 ReLU 함수로 활성화해준다. 과적합을 막기 위해 full6에는 훈련시 dropout이 적용된다. dropout에 대해서는 AlexNet 포스팅을 참고하자. 

 

7) 일곱번째 레이어(fully-connected 레이어, full7): 4096개의 뉴런으로 구성되어 있다. full6의 4096개 뉴런과 fully-connected(전 층과 이번 층의 모든 뉴런이 서로 다 연결)되어 있다. 출력된 값을 역시 ReLU 함수로 활성화해준다. full7에는 훈련시 dropout이 적용된다. 

 

8) 여덟번째 레이어(fully-connected 레이어, full8): 1000개의 뉴런으로 구성되어 있다. full7의 4096개 뉴런과 fully-connected 되어 있다. 출력된 값은 softmax 함수로 활성화되어 입력된 이미지가 어느 클래스에 속하는지 알 수 있게 해준다. 

 

왜 VGG-F가 가장 빠른가?

방금 전 챕터에서 VGG-F의 구조에 대해서 자세히 살펴봤다. 글의 초반부에 VGG-F가 VGG-M과 VGG-S에 비해 계산에 있어 더 빠르다고 했는데, 그 이유에 대해 살펴보려고 한다.

 

먼저 VGG-F와 VGG-M의 연산량을 비교해보자. 연산량에 가장 큰 차이를 유발하는 곳은 바로 첫번째 레이어다. VGG-F는 첫번째 레이어에서 입력영상을 64개의 11 x 11 x 3 사이즈 필터커널로 보폭 4로 컨볼루션해주는 반면, VGG-M은 첫번째 레이어에서 입력영상을 96개의 7 x 7 x 3 사이즈 필터커널로 보폭 2로 컨볼루션해준다. 필터커널의 사이즈가 작을수록, 또한 보폭이 작을수록 연산량은 많아진다. 

 

이번에는 VGG-M과 VGG-S의 연산량을 비교해보자. 연산량에 가장 큰 차이를 유발하는 곳은 바로 두번째 레이어다. 두번째 레이어에서 VGG-S는 VGG-M이 보폭2로 컨볼루션을 진행하는 것과 달리 보폭1로 컨볼루션을 진행한다. 

 

이와 같은 이유로 VGG-F가 VGG-M보다 빠르고, VGG-M은 VGG-S보다 빠르다. 반면 느린 만큼 정확도는 VGG-S가 가장 좋다. 

 

특성맵 크기 계산 관련

컨볼루션 이후 산출되는 특성맵의 크기 계산해서 좀 더 설명할 필요가 있어보인다. 간단한 예를 들어 실제로 특성맵의 크기를 구해보자. 9 x 9 사이즈의 입력 영상을 zero padding을 1만큼 해준 후 5 x 5 사이즈의 필터커널로 컨볼루션을 해주면 산출되는 특성맵의 크기는 어떻게 될까? 컨볼루션 보폭(stride)은 1로 설정하겠다.  

 

zero padding이 1만큼 이뤄진 후에는 다음과 같이 11 x 11 사이즈의 이미지가 된다.

 

9 x 9 이미지에 zero padding을 1만큼 적용해준 결과

 

가장자리에 0이 하나씩 더 추가된 것을 확인할 수 있을 것이다. 이제 5 x 5 필터커널을 가지고 좌측상단부터 보폭1로 컨볼루션을 진행해준다. 

 

5 x 5 필터커널은 우로 이동하면서 총 7번의 컨볼루션 연산을 진행하고, 또한 아래로 이동하면서 총 7번의 컨볼루션 연산을 진행한다. 따라서 7 x 7 특성맵이 산출되는 것이다. 

 

만약 컨볼루션 보폭이 2라면 두 칸씩 움직이기 때문에, 오른쪽 끝에 도달할 때까지 4번, 아래 끝에 도달할 때까지 4번 컨볼루션 연산이 진행된다. 이때는 4 x 4 특성맵이 산출된다. 

 

 

이것을 일반화하면 다음과 같은 공식이 만들어진다. 입력 이미지의 크기가 H x W이고, zero padding을 P만큼 해주고, 필터의 크기가 $F_H$ x $F_W$이고, 컨볼루션 보폭(stride)이 S라면, 특성맵의 높이와 너비는 각각

 

$Feature \: Map \: Height = \frac{H + 2P - F_H}{S} + 1$

 

$Feature \: Map \: Width = \frac{W + 2P - F_W}{S} + 1$

 

이 된다.

 

공식이 잘 작동하는지 확인해보자. 9 x 9 이미지에 zero padding을 1만큼 해주고, 필터의 크기가 5 x 5이고, 보폭이 1일 때 특성맵의 높이 및 너비는

 

(9 + 2 - 5)/1 + 1 = 6/1 + 1 = 7

 

이므로 위에서 구한 7 x 7과 동일하다. 또한 동일한 조건에 보폭만 2로 바꿨을 때 특성맵의 높이 및 너비는

 

(9 + 2 - 5)/2 + 1 = 6/2 + 1 = 4

 

이므로 위에서 구한 4 x 4와 동일하다. 공식이 잘 작동됨을 확인했다. 

 

-----

 

오늘은 VGG-F, VGG-M, VGG-S의 구조에 대해서 살펴봤습니다. 다음에는 VGG16, VGG19에 대해서 포스팅하도록 하겠습니다. 여기까지 열심히 읽어준 분들께 감사의 말씀을 드립니다.^^

 

 

<참고자료>

[1] http://taewan.kim/post/cnn/, TAEWAN.KIM 블로그, "CNN, Convolutional Neural Network 요약"

[2] http://www.vlfeat.org/matconvnet/models/imagenet-vgg-f.svg, VGG-F 상세 구조도

  1. 감사합니다이(가) 2019.08.26 19:42에 작성한 댓글:
    도움되었습니다. 감사합니다 ㅎ.ㅎ   주소   수정/삭제   답글
이름
비밀번호
홈페이지
비밀여부

2차 정방행렬(정사각형행렬)의 역행렬을 구하는 법은 고등학교 수학과정을 배운 사람이라면 모두 다 알 것이다. 다음과 같은 2차 정방행렬이 있다.

 

$A = \begin{bmatrix}
1 & 2\\ 
3 & 4
\end{bmatrix}$

 

이 행렬의 역행렬은 다음과 같다. 

 

$A^{-1} = -\frac{1}{2}\begin{bmatrix}
4 & -2\\ 
-3 & 1
\end{bmatrix}$

 

방금 나는 아래 공식에 따라 역행렬을 구했다. 아마 익숙한 공식일 것이다. 

 

2차 정방행렬의 역행렬 구하는 공식

그런데 이 공식은 2차 정방행렬에만 적용될 수 있다. 만약 정방행렬의 차수가 3차, 4차,..., n차라면 역행렬을 어떤 방식으로 구할 수 있을까? 오늘은 바로 그에 대한 해결책에 대해 살펴보려고 한다. 

 

가우스-요르단 소거법으로 n차 정방행렬의 역행렬 구하기

가역(invertible)인 n차 정방행렬의 역행렬은 가우스-요르단 소거법으로 구할 수 있다. 가역이라는 것은 역행렬이 존재한다는 뜻이다. 가우스-요르단 소거법의 기본적인 아이디어는 다음과 같다.

 

"AX = I(항등행렬)라면 X는 A의 역행렬일 것이다. AX의 좌변을 IX로 바꿔주기 위해 기본행연산(elementary row operation)을 해주면, 그에 따라 우변도 바뀌게 될 것이고, 그 우변의 값이 바로 A의 역행렬을 의미하게 된다."

 

자, 이 말이 무슨 뜻인지 천천히 하나하나 살펴보자. 일단 기본행연산연립방정식의 해를 바꾸지 않으면서 행렬을 변형하는 방법들로 다음과 같은 것들을 포함한다.

 

1) 행렬의 한 행을 상수배한다.

2) 행렬의 두 행을 맞바꾼다.

3) 한 행을 상수배하여 다른 행에 더한다. 

 

여기서 행렬의 각 행은 각 일차방정식을 의미한다. 우리가 연립일차방정식의 해를 구할 때를 생각해보자. 해를 구하기 위해 어떤 일차방정식에는 상수배를 해주기도 하고, 또 상수배를 곱한 일차방정식을 또다른 일차방정식에서 더해주거나 빼주기도 한다. 그리고 각 일차방정식의 나열 순서는 계산 편의에 따라 바꿔주기도 한다. 이런 과정들을 해준다고 그 연립일차방정식의 해가 바뀌었던가? 그렇지 않았다. 해는 결국 동일했다. 

 

이러한 기본행연산을 행렬로 나타낸 것을 기본 행렬(elementary matrix)이라고 한다. 보통 E라고 표기한다.

 

우리는 $AX = I$의 좌변에 여러 개의 기본행렬을 곱해줘서 $AX$가 $IX$로 변하게 하고 싶다. 이것을 행렬의 곱으로 나타내면 다음과 같이 나타낼 수 있다.

 

$E_rE_{r-1}...E_2E_1AX = E_rE_{r-1}...E_2E_1I$

 

$IX = E_rE_{r-1}...E_2E_1I$

 

어떤 행렬에 항등행렬을 곱해주면 행렬 그 자신이 나오므로, 

 

$X = E_rE_{r-1}...E_2E_1$ 

 

이다. 따라서 A의 역행렬 $A^{-1}$은 $E_rE_{r-1}...E_2E_1$이다. X가 A의 역행렬이라고 위에서 언급했었다. 

 

가우스-요르단 소거법으로 3차 정방행렬의 역행렬 구하기 예제

아마 위 증명 과정이 막연하게 느껴지실 수도 있을 것 같다. 예제를 통해서 가우스-요르단 소거법을 좀 더 확실히 이해해보자. 다음과 같은 3차 정방행렬이 있다. 

 

$A = \begin{bmatrix}
2 & 1 & 1\\ 
4 & -6 & 0\\ 
-2 & 7 & 2
\end{bmatrix}$ 

 

가우스-요르단 소거법을 이용해서 A의 역행렬을 구해보자.

 

$AX = I$라면 X는 A의 역행렬일 것이다. 여기서 X와 I는 모두 3차 정방행렬이다. 기본행렬을 좌변과 우변의 왼쪽에 곱해주어 좌변의 A를 I로 바꿔줄 것이다. 그 결과 우리는 X, 즉 A의 역행렬을 알게 된다. 자, 이제 시작해보자. 

 

$AX = I$

 

$\begin{bmatrix}
2 & 1 & 1\\ 
4 & -6 & 0\\ 
-2 & 7 & 2
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
0 & 1 & 0\\ 
0 & 0 & 1
\end{bmatrix}$ 

 

먼저 A가 대각 성분 아래쪽이 모두 0인 상삼각행렬(upper triangular matrix)이 되도록 기본행연산을 해줄 것이다. 이를 위해 두번째 행과 세번째 행에서 첫번째 행의 상수배를 각각 빼준다.  

 

$\begin{bmatrix}
2 & 1 & 1\\ 
0 & -8 & -2\\ 
0 & 8 & 3
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
-2 & 1 & 0\\ 
1 & 0 & 1
\end{bmatrix}$

 

두번째 행에서는 첫번째 행을 2배한 것을 빼줬고, 세번째 행에서는 첫번째 행을 1배한 것을 더해줬다(-1배한 것을 빼줬다). 이번에는 세번째 행에서 두번째 행의 상수배를 빼준다. 

 

$\begin{bmatrix}
2 & 1 & 1\\ 
0 & -8 & -2\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
1 & 0 & 0\\ 
-2 & 1 & 0\\ 
-1 & 1 & 1
\end{bmatrix}$

 

세번째 행에서 두번째 행을 1배한 것을 더해줬다(-1배한 것을 빼줬다). A가 상삼각행렬로 변형되었다. pivot은 2, -8, 1인 것을 알 수 있다. 이제 상삼각행렬이 대각행렬(diagonal matrix)이 되도록 기본행연산을 해줄 것이다. 대각행렬이란 대각성분을 제외하고는 모든 성분이 0인 행렬을 의미한다. 첫번째 행과 두번째 행에서 세번째 행의 상수배를 빼서 각 행의 세번째 성분이 0이 되게 하자.  

 

$\begin{bmatrix}
2 & 1 & 0\\ 
0 & -8 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
2 & -1 & -1\\ 
-4 & 3 & 2\\ 
-1 & 1 & 1
\end{bmatrix}$

 

첫번째 행에서는 세번째 행을 1배한 것을 빼줬고, 두번째 행에서는 세번째 행을 2배한 것을 더해줬다(-2배한 것을 빼줬다). 이번에는 첫번째 행의 두번째 성분이 0이 되게 하기 위해서 첫번째 행에서 두번째 행의 상수배를 빼주자.

 

$\begin{bmatrix}
2 & 0 & 0\\ 
0 & -8 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
\frac{3}{2} & -\frac{5}{8} & -\frac{3}{4}\\ 
-4 & 3 & 2\\ 
-1 & 1 & 1
\end{bmatrix}$

 

첫번째 행에서 두번째 행을 1/8배 해준 것을 더해줬다(-1/8배 해준 것을 빼줬다). 그 결과 A가 대각행렬이 되었다. 이제 각 대각요소를 1로 만들어주자. 각 행을 적당한 상수를 곱해주면 된다. 첫번째 행은 1/2을 곱해주고, 두번째 행은 -1/8을 곱해주고, 세번째 행은 그대로 둔다(1로 곱해준다).

 

$\begin{bmatrix}
1 & 0 & 0\\ 
0 & 1 & 0\\ 
0 & 0 & 1
\end{bmatrix}X = \begin{bmatrix}
\frac{3}{4} & -\frac{5}{16} & -\frac{3}{8}\\ 
\frac{1}{2} & -\frac{3}{8} & -\frac{1}{4}\\ 
-1 & 1 & 1
\end{bmatrix}$  

 

여기서 X의 왼쪽이 항등행렬 $I$이므로, 

 

$X = \begin{bmatrix}
\frac{3}{4} & -\frac{5}{16} & -\frac{3}{8}\\ 
\frac{1}{2} & -\frac{3}{8} & -\frac{1}{4}\\ 
-1 & 1 & 1
\end{bmatrix}$

 

이다. 이 X가 바로 A의 역행렬이다. 

 

이 예제에서 우리는 3차 정방행렬의 역행렬을 구해봤는데, 4차, 5차,..., 100차 정방행렬의 역행렬도 동일한 방식으로 구할 수 있다. 이런 알고리즘을 개발해냈다는 것이 참 놀랍다.

 

 

<참고자료>

[1] 박부성 지음, "8일간의 선형대수학", 경문사

[2] Gilbert Strang 지음, "Linear algebra and its applications (제4판)", BROOKS/COLE CENGAGE Learning

이름
비밀번호
홈페이지
비밀여부
2019-06-24 19:00:49

LaTeX(레이텍이라 발음한다)은 논문을 쓰는데 있어서 거의 필수적인 도구다. 지금까지 SCI논문이나 컨퍼런스 논문을 쓸 때 LaTeX을 이용하지 않은 논문은 단 한편도 없다.

 

LaTex을 이용해서 논문의 원고를 작성할 때 기본적으로 텍스트를 작성하고 그림을 첨부하는 과정은 그다지 어렵지 않다. 조금만 살펴보면 어떻게 사용하는지 금방 알 수 있다.

 

하지만 표(table)의 경우에는 원하는 형식으로 만드는 것이 어렵다. 나도 처음에 표 때문에 굉장히 고생했다.

 

아래 링크는 LaTeX에서 표 만들기에 관한 글인데 좋은 정보들을 담고 있다. 

=> http://cfs3.tistory.com/upload_control/download.blog?fhandle=YmxvZzI0NzIwQGZzMy50aXN0b3J5LmNvbTovYXR0YWNoLzAvMy5wZGY%3D&filename=LATEX%20-%20AllaboutTable.pdf    

 

이 글을 참고하면 왠만한 모양의 표는 다 구현이 가능할 것이다.

 

(그런데 사실 어느 정도 필수적인 내용을 표에 잘 담아주면 출판사 쪽에서 나중에 제대로 다잡아준다. 그러니 너무 세세하게 까지 목숨 걸 필요는 없다. 그 시간에 논문의 내용적 질을 높이는 것이 훨씬 더 중요하다고 생각된다.)

이름
비밀번호
홈페이지
비밀여부

선형대수학 관련해서 오랜만에 포스팅을 합니다. 선형대수학은 영상처리 및 컴퓨터비전 분야를 연구하면 할수록 중요한 과목이라는 사실을 깨닫게 됩니다. 이미지를 행렬로 표현할 수 있고, 이미지에 어떠한 처리를 가하는 것은 결국 행렬의 연산이기 때문입니다. 오늘은 두 행렬의 곱에 대해 글을 쓰려고 합니다. 

 

고등학교때 처음 행렬(matrix)에 대해 배웠을 때, 두 행렬의 곱을 구하는 방법은 단 한가지였다.

 

두 행렬의 곱을 바라보는 관점1:

"행렬A와 행렬B를 곱한 결과 생성된 행렬AB의 (i, j) 요소는 행렬A의 i번째 행(row)과 행렬B의 j번째 열(column)을 곱한 것이다."

 

지금이야 이 방식을 이처럼 말로 표현할 수 있지만(매우 설명이 난해하긴 하지만), 그 당시만 해도 그냥 막연히 푸는 방법만 알았다. 사실 말을 어렵게 해서 그렇지 다들 알고 있는 방식일 것이다. 다음 예를 살펴보면, "아~ 이거였어! 이걸 뭐 이렇게 어렵게 설명했어!"라는 말이 나올 것이다. 

 

관점1 설명 예제

 

첫번째 관점의 핵심적인 연산은 행벡터와 열벡터의 곱인데, 이런 방식으로 대응되는 요소들을 곱하고 더해주는 것을 바로 내적(inner product)이라고 부른다. 

 

대학과정에 오면 이 관점을 넘어서서 두 가지의 관점을 더 제시해준다. 사실상 좀 더 의미있는 관점들이라고 볼 수 있다. 각각 하나씩 살펴보자. 

 

두 행렬의 곱을 바라보는 관점2: 

"행렬A와 행렬B를 곱한 결과 생성된 행렬AB의 j번째 열은 행렬A에 행렬B의 j번째 열을 곱해준 것이다."

 

그러니까 행렬AB의 첫번째 열은 행렬A에 행렬B의 첫번째 열을 곱해준 것이고, 행렬AB의 두번째 열은 행렬A에 행렬B의 두번째 열을 곱해준 것이란 뜻이다. 이 또한 위의 설명만 보면 머리가 아플 것이다. 아래 그림을 보면서 이해해보자. 

 

관점2 설명 예제

 

두번째 관점은 한 번에 한 열씩 계산해줄 수 있다. 첫번째 관점은 한 번에 한 요소씩 계산해줬던 것과 차이가 있다. 그런데 두번째 관점에서 한 열씩 계산하기 위해서는 위 그림과 같이 행렬과 열벡터를 곱해줘야한다. 벡터를 일종의 행렬로 보고 관점1의 방식으로 계산을 해줄 수도 있겠지만, 그렇게 한다면 이 관점2 방식의 장점이 사라진다. 대신 행렬과 열벡터의 곱을 다음과 같이 계산하자. 행렬과 열벡터의 곱은 행렬의 열벡터들을 열벡터의 요소들을 계수(coefficient)로 삼아 선형조합(linear combination)해주는 것과 같다. 이 말도 조금 어려우니 아래 그림으로 살펴보자. 

 

벡터 (1, 4), 벡터 (2, 5), 벡터 (3, 6)을 계수 7, 9, 11로 선형조합했고, 벡터 (1, 4), 벡터 (2, 5), 벡터 (3, 6)을 계수 8, 10, 12로 선형조합했다. 행렬과 열벡터의 곱은 이러한 물리적 의미가 있는 것이다. 마지막으로 세번째 관점에 대해서 살펴보자. 

 

두 행렬의 곱을 바라보는 관점3: 

"행렬A와 행렬B를 곱한 결과 생성된 행렬AB의 i번째 행은 행렬A의 i번째 행에 행렬B를 곱해준 것이다."

 

관점2가 열의 관점에서 행렬A, B를 곱했다면, 관점3은 행의 관점에서 곱한다. 세 번째 관점은 한번에 한 행씩 계산해줄 수 있다. 

 

관점3 설명 예제

이번에는 행벡터와 행렬을 곱해줘야한다. 계산 방식은 관점2와 유사하다. 이번에는 행렬A의 행벡터의 요소들을 계수로 삼아 행렬B의 행벡터들을 선형조합해준다. 

 

벡터 (7, 8), 벡터 (9, 10), 벡터 (11, 12)를 계수 1, 2, 3으로 선형조합했고, 벡터 (7, 8), 벡터 (9, 10), 벡터 (11, 12)을 계수 4, 5, 6으로 선형조합했다. 행벡터과 행렬의 곱은 이러한 물리적 의미가 있는 것이다. 

 

 

세가지 관점을 요약해보자. 첫번째 관점은 행렬A와 행렬B의 곱 행렬AB를 구할 때 한번에 하나의 요소를 계산해주고, 두번째 관점은 한번에 하나의 열을 계산해주고, 세번째 관점은 한번에 하나의 행을 계산해준다.

 

 

<참고자료>

[1] Gilbert Strang, "Linear algebra and its applications(제4판)", BROOKS/COLE CENGAGE Learning

  1. 지나가다이(가) 2020.09.04 09:01에 작성한 댓글:
    굉장히 중요한 내용인데 잘 정리해주신 것 같아요...! 감사합니다   주소   수정/삭제   답글
  2. 선형대수학공부하는 복학생이(가) 2021.03.19 01:23에 작성한 댓글:
    정말 좋은 정리글 감사합니다!
    복학생 아재의 구세주이십니다 ㅎㅎ
      주소   수정/삭제   답글
  3. 리버이(가) 2021.04.17 21:48에 작성한 댓글:
    지금 하나씩 재미있게 보고있는 중입니다. 다만 궁금한 것이 있는데 제가 생각했을때는 위의 세가지가 크게 시사하는 바가 다른지 모르겠습니다. 너무도 당연한것 같아서.. 혹시 활용이라던가 어떤 부분에 대해서는 위의 세가지 관점이 다르게 적용되었을때 차이점이 나타나는 부분이 있나요? 이를테면 계산 cost라던가 ..   주소   수정/삭제   답글
    • 비스카이비전이(가) 2021.04.18 10:29 신고에 작성한 답글:
      그러고 보니 이 글만으로는 계산하는 방법이 다른 것 말고는 크게 시사하는 바가 없네요 ㅎㅎ 최근에 제가 작성한 https://bskyvision.com/1106 이 글을 참고하시면 좋을 것 같습니다 ㅎㅎ   주소   수정/삭제
이름
비밀번호
홈페이지
비밀여부
2019-06-19 14:41:27

오늘 스킨을 앰원리액트(M1react)로 교체했습니다. 교체 이유는 다음과 같습니다.

 

1) 2단 형식의 반응형 스킨을 사용하고 싶었습니다. 글, 카테고리, 블로그 설명 등이 한 눈에 보이는 것을 좋아해서요.^^  

2) 좀 더 깔끔하고 예쁜 스킨을 사용하고 싶은 향한 갈망이 있었습니다. 

 

교체하느라 이것저것 손봤는데 오늘 bskyvision.com을 방문하시고 글을 보시던 분들께는 혼란을 야기했을 것 같아 죄송하네요..^^; 이제는 웬만해선 스킨을 안 바꾸려고 합니다. 

 

이 스킨을 사용하시고 싶은 분들께는 아래 링크들이 도움이 되실 것입니다. 

 

https://m1story.tistory.com/71 => 앰원리액트 스킨 다운로드

https://m1story.tistory.com/72 => 앰원리액트 스킨 설치 및 설정방법

https://m1story.tistory.com/73 => 앰원리액트 스킨에 에드센스 광고 넣는 방법

 

 

이름
비밀번호
홈페이지
비밀여부
2019-06-14 17:22:15

 

MATLAB의 zscore 함수를 설명하기 전에 먼저 zscore 함수가 어떤 상황에 사용될 수 있는가를 먼저 예를 통해서 살펴보려고 한다. 

 

10명의 중학생이 있다. 이들의 수학, 영어, 국어, 과학 시험 점수는 다음과 같다.

 

 

나는 이 학생들이 이과 쪽이 적성에 맞을지, 문과 쪽이 적성에 맞을지 한명 한명 판단하고 싶다. 수학과 과학 점수가 좋다면 이과로 진학하는 것이 좋을 것이고, 영어와 국어 점수가 좋다면 문과로 진학하는 것이 좋을 것이다. 하지만 각 과목당 시험의 난이도가 다르기 때문에 단순히 점수만을 봐서는 이 학생이 어느 과목을 더 잘하는지 제대로 판단하기 어렵다. 그래서 수학, 영어, 국어, 과학 점수를 각각 표준화(standardization)해준다. 표준화라는 것은 원래 값에 평균값을 빼준 것을 표준편차로 나눠주는 것을 의미한다. 다음 공식을 참고하자. 

 

$z = \frac{x - \mu}{\sigma}$ ... (공식 1)

 

결과적으로 표준화된 값들의 평균은 0이고 표준편차는 1이 된다. 이때 사용할 수 있는 매틀랩 함수는 바로 zscore이다. 표준화를 해주면 난이도가 다른 각 과목의 점수들을 상대적으로 평가할 수 있게 된다. 

 

표준화한 점수들을 아래 그래프에 그려보았다. 

 

 

각 과목당 평균 점수는 0이 되었고, 표준편차는 1이 되었다. 표준화된 z-점수는 각 시험의 난이도를 고려한 점수라고 볼 수 있겠다.  

 

이제 이 그래프를 참고해서 학생들을 진학상담을 해주자. 

 

"학생1아, 너는 과학과 수학을 비교적 잘하는구나. 이과 가는거 어떠니?"

"학생2야, 너는 국어, 과학, 영어, 수학 순으로 잘하는구나. 명확하진 않은데, 그래도 국어와 영어는 평균 이상의 실력이 되니 문과 가는거 어떨까?"

"학생3아, 너는 영어와 국어는 상당히 잘하는 반면에, 수학과 과학은 좀 많이 못하는구나. 문과 가야겠네."

...

"학생10아, 너는 다 평균 이상은 하는구나. 국어를 제일 잘하긴 하다면, 다른 과목 성적들과 큰 차이 없으니 알아서 잘 결정하도록 하거라."

 

이런 식으로 진학상담을 해줄 수 있을 것이다. 진학상담 문제를 매우 단순화시켰지만, 도움은 될 거라고 생각한다. 왜냐하면 꽤 많은 학생들이 자신이 시험에서 받은 점수만을 보고 자신이 어떤 과목을 더 잘하는지 판단하곤 하기 때문이다. 

 

사용된 MATLAB 코드

clc, clear, close all

X = [89 63 74 95; 
     76 75 82 90; 
     72 89 85 79; 
     95 76 80 88; 
     66 77 69 81; 
     80 59 78 94; 
     85 69 77 85; 
     78 81 83 87;
     92 79 79 91;
     86 81 85 92];
 
 Z = zscore(X, 1); % 표준화된 Z-점수 얻기
 
 figure,
 plot(Z(:, 1), 'b*');
 hold on
 plot(Z(:, 2), 'ro');
 plot(Z(:, 3), 'g^');
 plot(Z(:, 4), 'cs');
 
 title('표준화된 Z-점수')
 xlabel('학생')
 ylabel('표준화된 점수')
 legend('수학', '영어', '국어', '과학')
 grid on

 

여기서 핵심 코드는 Z = zscore(X, 1)이다. 1의 의미는 X를 전체 모집단으로 본다는 것이다. 위의 공식 1에 따라 표준화하겠다는 것이다. 공식 1에서 $\mu$는 모평균(모집단의 평균), $\sigma$는 모표준편차(모집단의 표준편차)를 의미한다. 모표준편차는 다음과 같이 구한다.

 

$\sigma = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \mu)^2}{n}}$

 

만약에 Z = zscore(X, 0) 또는 Z = zscore(X)으로 코드를 작성한다면, X를 표본으로 구성된 것으로 보고 $z = \frac{x - \bar{X}}{S}$에 의해 표준화된 z-점수를 산출한다. $\bar{X}$는 표본평균(표본의 평균)을, $S$는 표본표준편차(표본의 표준편차)를 의미한다. 표본표준편차는 다음과 같이 구한다. 

 

$S= \sqrt{\frac{\sum_{i=1}^{n}(x_i - \bar{X})^2}{n-1}}$

 

분모가 n-1임에 유의하자.

 

이 글이 도움이 되셨다면, 공감을 남겨주시길 부탁드립니다. 끝까지 읽어 주셔서 감사합니다! 

 

 

bskyvision의 추천글 ☞

정규 분포와 정규 분포의 표준화의 의미

정규화(normalization)와 표준화(standardization), 머신러닝 성능향상을 위한 필수 단계

모집단(poplulation)과 표본(sample)  

모평균, 모분산과 표본평균, 표본분산 그리고 표본평균의 평균, 표본평균의 분산

이름
비밀번호
홈페이지
비밀여부
2019-06-03 17:20:25

오늘 포스팅하는 대표값은 예전에 중국 칭화대학교의 신호처리 Lab에 석사를 지원했을 때, 면접 중에 교수님들이 내게 물어봤던 것이다.

 

"평균, 중앙값이 뭐죠? 또 C언어로 코딩한다면 어떻게 코딩해야할까요?"

 

그 당시에 나는 이 질문에 제대로 답변을 못했다. 중앙값에 대한 이해가 없었다. 당연히 중앙값에 대해서는 코드를 작성할 수도 없었다. 그리고 얼마 지나지 않아 불합격 소식을 듣게 되었다. 그 덕분(?)에 나는 지금 이 톈진대학교에 오게 되었다. 이곳에서 그간 많이 성장해왔으니 감사하게 생각하고 있다.  

 

그만큼 대표값이라는 개념은 통계에 있어서 매우 기본 중의 기본이다. 그 당시에 나는 통계학에 있어서는 정말 기본도 몰랐던 것이다. 통계학은 어떤 전공을 막론하고 필수과목이 되어가고 있다. 혹시 나처럼 어떤 학교나 회사에 지원할 때 면접관이 물어볼 수도 있으니 잘 알아두길 권한다.

 

대표값

많은 숫자로 이루어진 자료가 있다고 가정하자. 이러한 자료 전체의 특징을 대표적으로 나타내는 값을 바로 대표값이라고 한다. 대표값은 자료의 중심적 성향(central tendency)을 나타내는 수치다. 대표값에는 평균(mean), 중앙값(median), 최빈값(mode) 등이 있다. 

 

평균은 전체변량의 총합을 변량의 개수로 나눈 값을 의미한다. 중앙값은 변량을 작은 값부터 크기 순서로 나열할 때, 중앙에 위치한 값을 의미한다. 최빈값은 변량 중에서 가장 많이 나타나는 값을 말한다. 

 

아주 간단하게 평균, 중앙값, 최빈값에 대해 정의를 내렸는데, 하나의 예를 통해 좀 더 자세하게 살펴보자. 

 

3, 1, 6, 2, 5, 5, 2, 5, 3과 같이 9개의 숫자들로 구성된 자료가 있다고 가정하자. 이 자료의 평균, 중앙값, 최빈값을 구해보자. 

 

1) 평균

위 자료의 평균을 구하는 것은 매우 간단하다. 수치들을 모두 더해서 수치의 갯수로 나눠주면 되기 때문이다. 

 

$\frac{3+1+6+2+5+5+2+5+3}{9} = 3.5556$

 

2) 중앙값

중앙값을 구하기 위해서는 먼저 작은 숫자부터 하나씩 나열해줘야한다. 그러면 다음과 같아진다. 

 

1, 2, 2, 3, 3, 5, 5, 5, 6

 

중앙값은 단순히 크기 순으로 나열했을 때 중앙에 위치하는 값이다. 따라서 중앙값은 3이 된다.

 

변량이 홀수개일 때 중앙값 구하기

방금은 변량의 갯수가 홀수개이므로 이렇게 중앙에 있는 숫자를 찾아서 중앙값으로 삼을 수 있었다. 그런데 만약 변량이 짝수개라면 어떻게 해야할까? 중간에 위치한 두 숫자의 평균이 바로 중앙값이 된다.

 

작은 수부터 나열된 자료가 다음과 같다고 생각해보자(위에서 1만 제거했다). 

 

2, 2, 3, 3, 5, 5, 5, 6

 

이 8개 숫자들의 중간은 3과 5의 사이라고 볼 수 있다. 따라서 이런 경우에 중앙값은 3과 5의 평균, 즉 (3 + 5)/2 = 4가 된다. 

 

변량이 짝수개일 때 중앙값 구하기

 

3) 최빈값

최빈값은 가장 빈도수가 큰 값이다. 3, 1, 6, 2, 5, 5, 2, 5, 3에서 1은 1회, 2는 2회, 3은 2회, 5는 3회, 6은 1회 출현하므로, 여기서 최빈값은 5가 된다. 

 

정리하자면, 3, 1, 6, 2, 5, 5, 2, 5, 3이라는 자료에서 평균은 3.5556, 중앙값은 3, 최빈값은 5이다.

 

이상치가 존재할 때는 평균보단 중앙값과 최빈값

사실상 평균을 대표값으로 가장 많이 사용하긴 하지만, 자료(데이터) 내에 이상한 수치, 즉 이상치가 존재하는 경우에는 평균은 데이터를 대표하는 대표값으로써 적합하지 않을 수 있다. 1, 1, 2, 3, 5, 1, 6, 4, 100, 1, 2와 같은 데이터가 있다고 가정해보자. 평균을 구해보면, 11.4545가 나온다. 대부분이 6이하의 고만고만한 숫자들인데 평균은 10보다 큰 값이 나왔다. 100이라는 다른 변량들과는 너무나 차이가 큰 단 하나의 변량 때문이다. 이때는 평균보다는 중앙값이나 최빈값이 이 데이터의 대표값으로 좀 더 잘 어울린다고 볼 수 있다. 

 

위 데이터를 작은 변량값부터 하나씩 나열하면, 1, 1, 1, 1, 2, 2, 3, 4, 5, 6, 100이다. 따라서 중앙값은 2가 된다. 또한 최빈값은 1이 된다. 1과 2가 11.4545보다는 이 데이터를 더 잘 대표한다고 생각되지 않는가? 

 

중앙값과 최빈값은 평균에 비해 이상치의 영향을 덜 받는 robust한 대표값이라고 말할 수 있다. 

 

 

<참고자료>

[1] http://m.blog.daum.net/rhaoslikesan/293?categoryId=33, 산을좋아한라쯔 "평균, 기댓값, 분산, 기대효용"

[2] 와쿠이 요시유키, 와쿠이 사다미 지음, "그림으로 설명하는 개념 쏙쏙 통계학", 성안당

[3] https://terms.naver.com/entry.nhn?docId=5683419&cid=47324&categoryId=47324, 네이버 지식백과, "중학수학 비주얼 개념사전 3학년 2학기, 대푯값"

이름
비밀번호
홈페이지
비밀여부

요즘 semantic segmentation을 활용하는 연구를 하나 진행하고 있다. semantic segmentation, 이름만 봐서는 이것이 무엇인지 감이 안오는 분들이 있을 것이다. 구지 번역하자면 '의미적 분할' 정도로 번역이 가능할 것 같다. 간단히 이야기해서 이미지를 의미있게 분할하는 것이 바로 semantic segmentation이다. 이 글을 차근히 읽어나가면 확실하게 알 수 있을 것이다. 인내하고 끝까지 읽는 자에게 복이 있나니...^^

 

오늘 이 글에서는 semantic segmentation의 목적이 무엇인지, 어디에 적용될 수 있는지, 그리고 대표적인 알고리즘인 FCN(fully convolutional networks)의 원리는 무엇인지에 대해서 소개하려고 한다. 

 

Semantic segmentation의 목적

semantic segmentation이미지 내에 있는 물체들을 의미 있는 단위로 분할해내는 것이다. 좀 더 구체적으로 이야기하면, 이미지의 각 픽셀이 어느 클래스에 속하는지 예측하는 것이다. 이렇게 이미지 내 모든 픽셀에 대해서 예측을 진행하기 때문에 이 과제를 dense prediction이라고 부르기도 한다. 어떤 이미지 내에는 사람, 자동차, 강아지, 고양이, 노트북, 선풍기 등 여러 종류의 물체가 포함되어 있을 수 있다. 이렇게 서로 다른 종류의 물체들을 깔끔하게 분할해내는 것이 semantic segmentation의 목적이다. 

semantic segmentation의 목적 [4]

사람의 눈으로 이미지를 의미에 따라 분할해내는 것은 결코 어렵지 않은 일이다. 하지만 이것을 컴퓨터, 기계에게 하라고 하면 결코 쉽지 않은 작업이다. 불과 몇년 전까지만 해도 사실상 거의 불가능했다. 딥러닝이 발전하기 전까지만 해도 말이다. 그러나 딥러닝의 한 알고리즘인 컨볼루션 신경망(Convolutional neural network, CNN)이 등장하면서 엄청난 발전을 이뤘다. 잘 훈련된 semantic segmentation 알고리즘은 사람과 비슷한 수준으로 semantic segmentation을 수행한다. 물론 알고리즘을 훈련시키기 위해서는 수만장의 이미지와 그에 해당하는 픽셀 단위 ground-truth 라벨값들이 투입되어야한다.

 

semantic segmentation을 어떤 이미지에 시행하면 다음 그림과 같이 각 픽셀이 어느 클래스에 속하는지 알게 된다. 즉, semantic segmentation 알고리즘의 입력값은 컬러 이미지 또는 흑백 이미지고, 출력값은 각 픽셀의 예측된 클래스를 나타내는 segmentation map이다. 이 segmentation map을 얻는 것이 semantic segmentation의 실질적 목적이다. 

 

Semantic segmentation의 적용분야

semantic segmentation의 주된 적용분야 중에 하나가 바로 '자율주행자동차'다. 아래 그림을 살펴보자. 

 

semantic segmentation과 자율주행자동차 [2]

위 그림을 보면 사람, 자동차, 트램, 신호등, 표지판, 나무, 도로 등으로 이미지가 분할된 것을 확인할 수 있다. 자율주행자동차에 탑재된 카메라들로부터 촬영된 영상들에서 사람, 자동차, 신호등, 표지판, 도로 등이 어디에 있는지를 알아내야 안전하게 주행을 수행할 수 있기 때문에, semantic segmentation은 필수적인 과정이다. 

 

또한 영상처리 및 컴퓨터비전이 그동안 의료 분야에 많이 기여해왔던 것처럼 semantic segmentation도 역시 의료 이미지 분석에 적용될 수 있다. 아래 그림을 참고하자. 

 

흉부 X-ray에 semantic segmentation이 적용된 예 [4]

 

흉부 X-ray 사진에 semantic segmentation을 수행했더니 심장(빨강색), 폐(연두색), 쇄골(파란색)과 같은 부분들을 잘 분할해냈다. 이와 같은 처리는 의사가 X-ray 사진을 분석하는데 도움이 될 것이다. 

 

Semantic segmentation의 대표적 알고리즘, FCN

그렇다면 Semantic segmentation 알고리즘들은 어떤 원리로 이렇게 멋진 작업을 수행해내는 것일까? Semantic segmentation에서 가장 대표적인 모델인 FCN (fully convolutional networks)에 대해서 여기서 소개하겠다.

 

FCN은 버클리 대학의 Jonathan Long 등이 2015년 CVPR에 발표한 Semantic segmentation 알고리즘이다[8]. FCN의 original 논문의 제목은 "Fully convolutional networks for semantic segmentation"이다. 이후에 출시된 알고리즘들은 사실상 FCN을 개선한 아류작들이라고 볼 수 있다. 그만큼 FCN이 선두적인 역할을 했다. 

 

AlexNet, VGGNet 등 이미지 분류(image classification)용 CNN 알고리즘들은 일반적으로 컨볼루션 층들과 fully connected 층들로 이뤄져있다. 항상 입력이미지를 네트워크에 맞는 고정된 사이즈로 작게 만들어서 입력해준다. 그러면 네트워크는 그 이미지가 속할 클래스를 예측해서 알려준다. 아래 그림에서 네트워크는 입력된 이미지의 클래스를 얼룩무늬 고양이(tabby cat)라고 예측해냈다. 

 

이미지 분류용 CNN 알고리즘의 기본 구조(컨볼루션 층들 + fully connected 층들) [6]

 

이 분류용 CNN 알고리즘들은 이미지에 있는 물체가 어떤 클래스에 속하는지는 예측해낼 수 있지만, 그 물체가 어디에 존재하는지는 예측해낼 수 없다. 왜냐하면 네트워크 후반부의 fully connected 층에 들어서면서 위치정보가 소실되었기 때문이다. 따라서 AlexNet, VGGNet 등과 같은 알고리즘들을 수정함없이 Semantic segmentation 과제에 그대로 사용하는 것은 불가능하다.  

 

FCN 개발자들은 위치정보가 소실되지 않게 하기 위해서, 또한 어떠한 크기의 입력이미지도 허용하기 위해서 다음과 같이 알고리즘을 발전시켜간다. 먼저 고정된 크기의 인풋만을 허용하는 fully connected 층을 1x1 컨볼루션층으로 바꿔준다. 

 

fully connected 층들을 1x1의 컨볼루션층들로 전환 [6]

결과적으로 네트워크 전체가 컨볼루션층들로 이뤄지게 되었다. fully connected 층들이 없어졌으므로 더 이상 입력 이미지의 크기에 제한을 받지 않게 되었다. 

 

입력이미지의 크기에 자유해졌다. [6]

이제 어떠한 사이즈 H x W의 이미지도 이 네트워크에 입력될 수 있다. 여러 층의 컨볼루션층들을 거치고 나면 특성맵(feature map)의 크기가 H/32 x W/32가 되는데, 그 특성맵의 한 픽셀이 입력이미지의 32 x 32 크기를 대표한다. 즉, 입력이미지의 위치 정보를 '대략적으로' 유지하고 있는 것이다. 

 

여기서 중요한 것은 이 컨볼루션층들을 거치고 나서 얻게 된 마지막 특성맵의 갯수는 훈련된 클래스의 갯수와 동일하다는 것이다. 21개의 클래스로 훈련된 네트워크라면 21개의 특성맵(이것을 heatmap이라고도 부른다)을 산출해낸다. 각 특성맵은 하나의 클래스를 대표한다. 만약 고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀값들이 높고, 강아지 클래스에 대한 특성맵이라면 강아지 위치의 픽셀값들이 높다. 

 

heatmap 설명 [7]

 

이 대략적인(coarse) 특성맵들의 크기를 원래 이미지의 크기로 다시 복원해줄 필요가 있다. 이미지의 모든 픽셀에 대해서 클래스를 예측하는 dense prediction을 해주는 것이 semantic segmentation의 목적이기 때문이다. (coarse와 dense는 서로 반의어다.) 이 원래 이미지 크기로 복원하는 과정을 upsampling이라고 부른다. upsampling을 통해 각 클래스에 해당하는 coarse한 특성맵들을 원래 사이즈로 크기를 키워준다. upsampling된 특성맵들을 종합해서 최종적인 segmentation map을 만든다. 간단히 말해서, 각 픽셀당 확률이 가장 높은 클래스를 선정해주는 것이다. 만약 (1, 1) 픽셀에 해당하는 클래스당 확률값들이 강아지 0.45, 고양이 0.94, 나무 0.02, 컴퓨터 0.05, 호랑이 0.21 이런 식이라면, 0.94로 가장 높은 확률을 산출한 고양이 클래스를 (1, 1) 픽셀의 클래스로 예측하는 것이다. 이런 식으로 모든 픽셀이 어느 클래스에 속하는지 판단한다. 

 

FCN-32s 모델 [7]

 

그런데 단순히 upsampling을 시행하면, 특성맵의 크기는 원래 이미지 크기로 복원되고, 그것들로부터 원래 이미지 크기의 segmentation map을 얻게 되지만 여전히 coarse한, 즉 디테일하지 못한 segmentation map을 얻게 된다. 1/32만큼 줄어든 특성맵들을 단숨에 32배만큼 upsampling 했기 때문에 당연히 coarse할 수 밖에 없다. 이렇게 단숨에 32배 upsampling하는 방법을 논문에서는 FCN-32s라고 소개하고 있다. 아래 그림을 보자. ground truth와 비교해 FCN-32s로 얻은 segmentation map은 많이 뭉뚱그려져 있고 디테일하지 못함을 알 수 있다.

 

coarse한 segmentation map [8]

 

FCN의 개발자들은 좀더 디테일한 segmentation map을 얻기 위해 skip combining이라는 기법을 제안한다. 기본적인 생각은 다음과 같다. 컨볼루션과 풀링 단계로 이뤄진 이전 단계의 컨볼루션층들의 특성맵을 참고하여 upsampling을 해주면 좀 더 정확도를 높일 수 있지 않겠냐는 것이다. 왜냐하면 이전 컨볼루션층들의 특성맵들이 해상도 면에서는 더 낫기 때문이다. 이렇게 바로 전 컨볼루션층의 특성맵(pool4)과 현재 층의 특성맵(conv7)을 2배 upsampling한 것을 더한다. 그 다음 그것(pool + 2x conv7)을 16배 upsampling으로 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-16s라고 부른다. 아래 그림을 참고하자. 

 

FCN-16s 모델 [7]

 

또 더 나아가서 전전 컨볼루션층의 결과도 참고해서 특성맵들을 얻고, 또 그 특성맵들로 segmentation map을 구할 수도 있다. 이 방법은 FCN-8s라고 부른다. 좀 더 구체적으로 이야기하면, 먼저 전전 단계의 특성맵(pool3)과 전 단계의 특성맵(pool4)을 2배 upsampling한 것과 현 단계의 특성맵(conv7)을 4배 upsampling 한 것을 모두 더한 다음에 8배 upsampling을 수행하므로 특성맵들을 얻는다. 이것을 모두 종합해서 최종 segmentation map을 산출한다. 

 

FCN-8s 모델 [7]

아래 그림을 보면 FCN-8s가 FCN-16s보다 좀 더 세밀하고, FCN-32s보다는 훨씬 더 정교해졌음을 알 수 있다. 다른 논문에서, 또는 웹상에서 누군가 FCN을 말할 때는 보통 이 FCN-8s를 의미한다고 봐도 무방하다. 

 

FCN-8s가 FCN-32s와 FCN-16s보다 좀 더 정교하게 예측해냄을 알 수 있다. [8]

 

첨부1: Semantic segmentation과 Object detection의 차이

혹시나 semantic segmentation이 무엇인지 아직 헷갈릴 수도 있는 분들을 위해서 추가적으로 챕터를 준비했다. object detection과 비교해보면 semantic segmentation이 무엇을 위한 것인지 좀 더 분명하게 확인될 것이다. 바운딩 박스로 검출된 물체들을 나타내는 object detection과 다르게, semantic segmentation은 이미지 내 모든 픽셀이 각각 어느 클래스에 속하는지 예측하고 그것들을 모아서 이미지를 의미 있는 단위로 분할한다. 

 

object detection과 semantic segmentation 비교 [1]

위 그림과 같이 object detection은 이미지 내에서 물체들을 검출한 것을 직사각형의 바운딩 박스로 묶어서 표현해내는 반면, semantic segmentation은 각자 다른 클래스에 속하는 물체들을 좀 더 정확하게 분할해낸다. 양(sheep)들은 모두 양 클래스에 속하므로 하나의 색으로 표현되었다. 

 

첨부2: Semantic segmentation과 Instance Segmentation의 차이

semantic segmentation과 관련해서 조사를 하다보면 instance segmentation라고 불리는 것을 종종 보게 된다. semantic segmentation의 경우 같은 클래스에 속하면 각각 독립된 개체라고 하더라도 하나의 색으로 나타냈었다. 반면 instance segmentation의 경우 같은 클래스에 속하더라도 독립된 개체라면 각기 다른 색으로 표현해준다. 아래 그림에서 오른쪽 그림을 보면, 세 마리의 양들을 각기 다른 색으로 표현해준 것을 확인할 수 있다. 

 

semantic segmentation과 instance segmentation 비교 [1]

 


끝까지 읽어주셔서 대단히 감사합니다. 인내의 열매를 누리고 계실 것이라 믿으며 글을 마칩니다. 질문, 지적, 칭찬 모두 환영합니다.^^

 

 

<참고자료>

[1] https://towardsdatascience.com/detection-and-segmentation-through-convnets-47aa42de27ea, Ravindra Parmar, "Detection and Segmentation through ConvNets"

[2] https://thegradient.pub/semantic-segmentation/, The Gradient, "Going beyond the bounding box with semantic segmentation"

[3] https://medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb, 심현주, "1편: Semantic segmentation 첫걸음!"

[4] https://www.jeremyjordan.me/semantic-segmentation/#dilated_convolutions, Jeremy Jordan, "An overview of semantic image segmentation"

[5] http://blog.naver.com/PostView.nhn?blogId=laonple&logNo=220964957738&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView, 라온피플, "[Machine Learning Academy_part VII. Semantic Segmentation] 3. FCN [2]"

[6] https://towardsdatascience.com/review-fcn-semantic-segmentation-eb8c9b50d2d1, Sik-Ho Tsang, "Review: FCN-Fully Convolutional Network (Semantic Segmentation)"

[7] https://modulabs-biomedical.github.io/FCN, 모두의연구소, "Fully Convolutional Networks for Semantic Segmentation"

[8] Jonathan Long 등, "Fully Convolutional Networks for Semantic Segmentation", CVPR 2015 (FCN의 original 논문)

[9] https://reniew.github.io/18/, reniew's blog, "CNN을 활용한 주요 Model - (4) : Semantic Segmentation"

  1. yien이(가) 2019.09.27 11:21에 작성한 댓글:
    상세하고 친절한 설명 정말 감사합니다! :D   주소   수정/삭제   답글
  2. 박종환이(가) 2019.11.09 09:11에 작성한 댓글:
    세그멘테이션에 대해서 너무 좋은 글을 보고갑니다 감사합니다 :)   주소   수정/삭제   답글
  3. LEEE이(가) 2019.11.14 11:10에 작성한 댓글:
    디테일하게 설명 해주셔서 금방 이해가 갔습니다 감사합니다!   주소   수정/삭제   답글
  4. Taeho Kim이(가) 2020.02.02 01:47에 작성한 댓글:
    논문 읽다가 점점 큰 흐름을 놓치고 있는 것 같아서 검색했는데 자세한 설명해주셔서 다시 흐름을 잡을 수 있었습니다. 소중한 글 올려주셔서 정말 감사합니다:)   주소   수정/삭제   답글
  5. 팁텍북이(가) 2020.02.15 00:22 신고에 작성한 댓글:
    감사히 잘 읽었습니다!
    실례지만 카페에 소개하여 회원분들과 함께 읽어도 될까요?
    https://cafe.naver.com/rpamaster/1035
    소개한 게시글을 링크해드립니다. 감사합니다.^^
      주소   수정/삭제   답글
  6. Jude_Song이(가) 2020.05.17 17:01 신고에 작성한 댓글:
    양질의 글의 제공해 주셔서 감사합니다~   주소   수정/삭제   답글
  7. jemo이(가) 2020.09.03 23:22에 작성한 댓글:
    게시글 너무 잘봤습니다! 감사합니다 :)   주소   수정/삭제   답글
  8. jh이(가) 2020.11.10 11:45에 작성한 댓글:
    대단한 글 정말 감사합니다. 질문이 있는데요,

    heatmap 부분에서,,
    고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀값들이 높고, 강아지 클래스에 대한 특성맵이라면 강아지 위치의 픽셀값들이 높다고 하셨는데,,

    어떻게 이 단계에서 각 클래스의 위치와 픽셀 값의 차이가 발생하는 건가요?
    예를 들면, "heatmap 설명 [7]" 그림에서 고양이 2마리 사진이 있는 이미지를 넣었는데 컴퓨터가 개인지 고양이인지 어떻게 구분하는건지 이해가 안됩니다. object detection 영역에서는 고양이 2마리에 대한 bbox를 설정하고 해당 bbox의 클래스를 지정하면 되는걸로 알고있는데요,,,
    semantic segmentation 에서는 bbox를 사용하지 않는다고 하셨으니 그러면 입력 이미지 자체에 대해 클래스를 지정해서 넣는 방법밖에 없는 것 같은데요,, 그런데 그러면 사물들이 어떤 클래스인지 컴퓨터가 어떻게 식별하나요? 그리고 이미지 자체에 대해 클래스를 지정한다고 한다면 여러 클래스가 동시에 존재하는건 클래스를 어떻게 부여하나요?

    그리고 위와 이어지는 질문일수도 있는데 이렇게 도출된 heatmap이 하나의 클래스를 대표한다고 하셨는데, 고양이도 여러 위치와 생김새가 있을건데 해당 이미지에서 도출된 heatmap이 하나의 클래스를 어떻게 대표하는지도 궁금합니다,,,

    질문이 많아서 죄송합니다,,, ㅠㅠ
      주소   수정/삭제   답글
    • 비스카이비전이(가) 2020.11.26 01:49 신고에 작성한 답글:
      답변이 너무 늦었네요..ㅜㅎㅎ

      우선 제가 이해한 대로 답변드리면,

      semantic segmentation의 경우 라벨을 픽셀 단위로 줍니다. 만약에 (640 x 480) 크기의 이미지가 있다면 각 픽셀마다 라벨이 매겨집니다. (1, 1), (1, 2)는 고양이, ..., (123, 252), (123, 253)은 강아지, 뭐 이런 식인 것이죠. ㅎㅎ
        주소   수정/삭제
이름
비밀번호
홈페이지
비밀여부

신뢰구간 추정에 대해 '언젠가 정리해야지 정리해야지' 미루다가 드디어 정리하게 되었다. 모호했던 개념들을 제대로 잡아보자.  

 

신뢰구간이란?

추정에는 점추정(point estimation)과 구간추정(interval estimation)이 있다. 점추정모수가 얼마일 것이라고 하나의 수치를 추정하는 것이다. 여기서 모수는 모평균, 모분산, 모표준변차, 모비율 등 모집단의 특성에 관한 수치들을 의미한다. 구간추정은 모수가 어느 값 a와 어느 값 b 사이, 즉 어떤 구간 내에 몇 %의 확률로 존재할 것이라고 추정하는 것이다(엄밀히 따지면 정확한 의미는 아니지만, 이렇게 받아들이는 것이 이해하기 쉽다[4]). 그 확률을 신뢰수준(confidence level) 또는 신뢰도라고 부르고, 그 추정한 구간을 신뢰구간(confidence interval)이라고 부른다. 여기서는 모평균 $\mu$의 신뢰구간을 추정하는 것을 다루겠다.

 

 

만약 누군가가 점추정를 통해 "A후보의 지지율은 54.3%입니다"라고 말한다면, 자신감 있어 보이더라도 틀린 말이 될 수 있다. 실제 지지율이 54.9%라면 말이다. 이와 같은 점추정은 틀릴 가능성이 높다. 반면 구간추정을 통해 "A후보의 지지율은 신뢰수준 95%로 신뢰구간 51.3%~57.3% 내에 있습니다"라고 말한다면, 좀 더 안전하다. 물론 구간추정도 틀릴 수 있지만, 점추정에 비하면 틀릴 가능성이 적다. 

 

모수가 신뢰구간 안에 포함되지 않을 확률을 보통 $\alpha$로 표현한다[2]. 자연스럽게 모수가 신뢰구간 안에 포함될 확률, 즉 신뢰수준은 $1-\alpha$로 표현된다.

 

 

만약 신뢰수준 $1-\alpha$이 0.95 즉, 95%라면 $\alpha = 0.05$이다. 이해를 위해 아래 그림을 참고하자. 

 

 

그림과 같이 모수가 신뢰구간에 속하지 않을 확률이 양쪽 꼬리부분에 각각 $\frac{\alpha}{2}$만큼씩 있다. 

 

신뢰구간을 추정할 때는 상황에 따라 다른 확률분포를 사용해야한다. 만약 모분산 $\sigma^2$을 알고 있다면, 표본의 크기와 관계없이 정규분포를 사용한다. (사실 모분산을 알고 있는 경우는 굉장히 드물지만.) 만약 모분산을 모를 때, 표본의 크기가 충분히 크면 정규분포를, 표본의 크기가 작으면 t분포를 사용한다. t분포를 사용하려면 모집단이 정규분포를 따라야한다는 한계가 있다[1]. 아래 그림에 정리를 해놓았다.

 

 

모분산을 알 때 모평균의 신뢰구간 추정

먼저 모분산을 아는 경우부터 살펴보자. 모분산을 안다는 것은 모표준편차를 안다는 것과 마찬가지다. 모평균을 $\mu$, 모분산을 $\sigma^2$, 모표준편차를 $\sigma$라고 할 때, 크기가 n인 표본의 표본평균 $\bar{X}$을 표준화하면, 다음과 같이 Z통계량이 된다.

 

Z통계량

 

왜냐하면 표본평균은 정규분포 $N(\mu, \frac{\sigma^2}{n})$을 따르기 때문이다. 

 

만약 95%의 신뢰수준으로 모평균이 신뢰구간 내에 존재한다고 하면, 표준정규분포표에 의해 다음과 같이 쓸 수 있다.

 

 

이 말은 a가 -1.96, b가 1.96이라는 것이다. 마찬가지로 신뢰수준이 $1-\alpha$일때도 그에 해당하는 a와 b의 값이 존재할 것이다. a와 b를 각각 $-z_{\alpha/2}$, $z_{\alpha/2}$라고 하면, 

 

이다. 여기서 $z_{\alpha/2}$는 표준정규분포의 오른쪽 꼬리 $\alpha/2$에 해당하는 면적을 가지는 z값을 의미한다(아래 그림 참고). 

 

 

따라서, 신뢰수준 $1-\alpha$인 신뢰구간은 다음과 같이 유도해낼 수 있다. 

 

 

$\alpha$에 따른 $z_{\alpha/2}$의 값은 표준정규분포표를 참조하면 알 수 있다. 

 

모분산을 알 때 모평균의 신뢰구간 추정 예제

그럼 이제 예제를 풀면서 모분산을 알 때 모평균의 신뢰구간을 어떻게 추정하는지 제대로 이해해보자.  

 

전국 고등학교 남학생의 평균키를 조사하는데, 모표준편차가 15cm라고 한다. 이때 100명의 남학생을 모집단에서 임의로 뽑아 키를 쟀더니 평균키가 172cm였다. 전국 고등학교 남학생의 평균키에 대한 95% 신뢰구간과 99% 신뢰구간을 추정하라. 

 

풀이>>

 

1) 95% 신뢰구간

이 문제에서 모표준편차 $\sigma=15$, 표본 크기 $n=100$, 표본평균 $\bar{X}=172$, $\alpha=0.05$, $\alpha/2=0.025$이다. 이 값들을 모평균의 신뢰구간 식에 대입하자. 그러면 신뢰구간은 다음과 같다.

$z_{0.025}$는 표준정규분포표에서 1 - 0.025 =0.975에 가장 가까운 z값을 찾으면 된다.

 

표준정규분포표, 출처[6]

 

위 표준정규분포표에서 빨간색으로 표시한 것과 같이 z = 1.96일 때 0.975에 가장 가까우므로 $z_{0.025}$에 대입한 후 정리하면 신뢰구간을 알 수 있다.

 

 

2) 99% 신뢰구간

99% 신뢰구간에서는 $\alpha=0.01$, $\alpha/2=0.005$이다. 따라서 $z_{0.005}$를 알아야하는데, 이것은 표준정규분포표에서 1 - 0.005 =0.995에 가장 가까운 z값을 찾으면 된다. 위 표준정규분포표에서 파란색으로 표시한 것과 같이 z = 2.58일 때 0.995에 가장 가깝다. 따라서 99% 신뢰구간은 다음과 같이 계산할 수 있다. 

 

 

95% 신뢰구간보다 99% 신뢰구간이 좀 더 넓은 것을 확인할 수 있다. 

 

 

 

모분산을 모를 때 모평균의 신뢰구간 추정

모분산을 모를 때는 t분포를 사용한다. t분포는 정규분포와 상당히 비슷한데 중심부는 낮아지고 양쪽 꼬리는 좀 더 높은 종 형태이다(아래 그림 참고). 자유도가 작을수록 꼬리부분이 높아지고, 자유도가 높을수록 표준정규분포에 가까워진다. 이 자유도는 표본의 크기에 따라 결정된다. (자유도 = n - 1)

 

표준정규분포(z분포)와 t분포 비교, 출처: [8]

 

모분산, 즉 모표준편차를 모르기 때문에 모표준편차 $\sigma$ 대신에 표본표준편차 $s$을 사용한다. t통계량은 다음과 같이 쓸 수 있다.

 

t통계량

 

따라서 모분산을 모를 때 모평균의 신뢰구간은 다음과 같이 바뀐다. 

$t_{\alpha/2}$은 t분포표를 참조하면 알 수 있다. 

 

모분산을 모르더라도 표본의 크기가 충분히 크다면($n \geq 30$) 정규분포를 사용할 수 있다. 표본의 크기가 30이상이면 t분포는 정규분포와 비슷해지기 때문이다. 이때는 Z변량에서 모표준편차 자리에 표본표준편차를 사용한다. 

 

 

모분산을 모를 때 모평균의 신뢰구간 추정 예제1

모분산을 모르고 표본의 크기가 작을 때 모평균의 신뢰구간 추정하는 예제를 먼저 풀어보자.

 

새롭게 개발한 자동차의 경제성을 측정하기 위해 휘발유 1리터로 주행할 수 있는 거리를 10대의 표본을 대상으로 측정했다. 측정 결과 표본평균은 17km, 표본표준편차는 0.7km였다. 이때 신형 자동차가 휘발유 1리터로 주행할 수 있는 평균거리의 95% 신뢰구간을 구하시오[5]. 

 

풀이>>

 

모표준편차를 모르고, 표본의 크기가 10으로 작기 때문에 t분포를 이용해야 한다. 표본평균 $\bar{X}=17$, 표본표준편차 $s = 0.7$, $n=10$, $\alpha=0.05$, $\alpha/2=0.025$이므로 신뢰구간을 다음과 같이 쓸 수 있다.

 

 

자유도 n-1 = 9일 때 $t_{0.025}$를 아래 t분포표에서 찾아보면 2.262임을 알 수 있다. 

 

t분포표, 출처: [7]

 

$t_{0.025}$에 2.262를 대입해서 계산하면 다음과 같이 95% 신뢰구간이 결정된다. 

 

 

 

모분산을 모를 때 모평균의 신뢰구간 추정 예제2

이번에는 모분산을 모르지만 표본의 크기가 클 때 모평균의 신뢰구간 추정하는 예제를 풀어보자.

 

어느 회사에서 제품의 모평균을 추정하기 위해 표본 30개를 뽑았는데, 표본평균이 500이고 표본표준편차가 40이라고 한다. 이 제품의 모평균에 대한 90% 신뢰구간을 추정하라. 

 

풀이>>

 

모표준편차를 모르지만, 표본의 크기 n=30으로 30이상이므로 정규분포를 사용해도 된다. 문제에 의하면 $\bar{X}=500$, $s=40$, $\alpha=0.1$, $\alpha/2=0.05$이다. 90% 신뢰구간은 다음과 같은 과정으로 계산할 수 있다. ($z_0.05$는 위 표준정규분표표에서 참조했더니 1.64였다. )

 

 

이 신뢰구간이 t분포를 이용해서 구해도 유사할까? 확인해볼 필요가 있다. t분포를 이용해서 구하면 다음과 같이 계산된다. (자유도 n-1 = 29일 때 $t_{0.05}$를 t분포표에서 찾으면 1.699임을 알 수 있다.)

 

 

정규분포를 이용해서 90% 신뢰구간을 구한 것과 큰 차이가 없음을 알 수 있다. 이 차이는 자유도와 직접적인 관계가 있는 표본의 크기가 커지면 커질수록 더 작아질 것이다. 

 

최선을 다해 쓴 글 중 하나입니다. 도움이 되시길 바라며 글을 마칩니다.^^ 도움이 되셨다면 공감을 눌러주시고, 질문 또는 피드백이 있으시면 댓글 남겨주세요!

 

참고자료

[1] https://blog.naver.com/antifatekr/221055745764, 설명충 "표본으로 모집단의 평균을 알 수 있는거야? - 중심극한의 정리와 모평균의 구간추정"

[2] https://math7.tistory.com/64?category=471451, 나부랭이의 수학블로그 "신뢰구간 개념정리!"

[3] https://support.minitab.com/ko-kr/minitab/18/help-and-how-to/statistics/basic-statistics/supporting-topics/basics/what-is-a-confidence-level/, minitab 18 지원 "신뢰 수준의 정의"

[4] https://www.youtube.com/watch?v=XmESERDUgsc, 수악중독 "모평균의 추정"

[5] http://www.hansung.ac.kr/web/eng-statistics/4?p_p_id=EXT_BBS&p_p_lifecycle=1&p_p_state=exclusive&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_EXT_BBS_struts_action=%2Fext%2Fbbs%2Fget_file&_EXT_BBS_extFileId=657274, 이상복, PhD "공학통계 제 9장 통계적 추정"

[6] https://oscarpark.tistory.com/1, Oscar sj Park "정규분포 이야기"

[7] http://blog.daum.net/kwans_kim/56, 빗줄기 "t분포표"

[8] http://contents.kocw.net/KOCW/document/2015/hanyang_erica/baekseunghyun/8-2.pdf   

 

 

(본문 내 쿠팡 파트너스 링크를 통해 물건을 구입하시면, 저는 일정액의 수수료를 제공받습니다.)

  1. 대학생이(가) 2019.10.16 18:37에 작성한 댓글:
    공부잘하고갑니다   주소   수정/삭제   답글
  2. 영도이(가) 2019.10.20 17:04에 작성한 댓글:
    이해하기 쉽게 정리 잘해주셨네요. 많은 도움이 되었습니다. 감사합니다!   주소   수정/삭제   답글
  3. 학생이(가) 2019.11.06 04:11에 작성한 댓글:
    글로도 이렇게 쉽게 사람을 이해시킬 수 있군요! 감사합니다.   주소   수정/삭제   답글
  4. 통계공부중이(가) 2019.11.21 02:28에 작성한 댓글:
    정말 쉽고 잘 쓴 글이라고 생각 됩니다
    이 글 읽고 한번에 이해가 됐어요
    정말 감사합니다:)

    t분포에 대한 설명이 더 있으면 좋을 것 같아요!
      주소   수정/삭제   답글
  5. 항상 초보이(가) 2020.03.06 11:36 신고에 작성한 댓글:
    최선을 다해 쓰신게 느껴지네요!! 많이 배우고 갑니다. 저도 이렇게 쉽게 이해되는 좋은 글을 쓰게 될 수 있었으면 좋겠어요 ㅎㅎ   주소   수정/삭제   답글
  6. 대학생이(가) 2020.04.27 02:55에 작성한 댓글:
    과제 중이었는데 너무 정성스러운 글이어서 도움이 많이 되었습니다. 좋은 글 정말 감사드립니다.~   주소   수정/삭제   답글
  7. Corgilog이(가) 2020.07.10 20:24 신고에 작성한 댓글:
    정리 수준 실화냐? 진짜 세계관 최강자의 정리다....   주소   수정/삭제   답글
  8. 익명이(가) 2020.08.06 01:00에 작성한 댓글:
  9. Helloworld이(가) 2020.09.30 18:58에 작성한 댓글:
    쉽고 정확하게 설명해주셔서 감사합니다!
    잘보고갈게요
      주소   수정/삭제   답글
  10. 대학생이(가) 2021.03.15 17:20에 작성한 댓글:
    안녕하세요! 정리가 잘 되어 있어 많이 배우고 갑니다ㅎㅎ 글꼴도 매우 가독성이 좋네요! 혹시 글꼴이 뭔지 알 수 있을까요?? 감사합니다:)   주소   수정/삭제   답글
  11. 아만다이(가) 2021.05.07 19:25에 작성한 댓글:
    정말 이해가 잘 되었습니다ㅎㅎ 감사히 공부 잘 하고 갑니다!!   주소   수정/삭제   답글
  12. 대학원생이(가) 2021.08.06 17:51에 작성한 댓글:
    한번에 이해됐습니다 너무 감사합니다   주소   수정/삭제   답글
  13. 이거아님이(가) 2021.08.29 03:18에 작성한 댓글:
    t 분포 쓰는지 아닌지는 n>30 인지 아닌지로 결정하는게 아닙니다; 그리고 모분산 안다 모른다로 처음부터 나누는게 아니라 모분포가 정규분포인지 아닌지가 먼저입니다. 1. 모분포가 정규분포인데 시그마를 안다 -> 그냥 exact z분포임/ 시그마 모른다 -> 이때 시그마 대신 s가 들어가면 그게 t 분포를 따르기 때문에 t 분포 사용함. 2. 모분산 정규분포 아닌데 n>30이다 -> CLT(중심극한정리)에 의해서 근사적으로 z 분포 따름, 이때는 시그마를 알든 모르든 즉 시그마를 사용하든 s를 사용하든 CLT가 성립하기 때문에 상관없음/ n<30이다, 이러면 모수적 방법으로는 신뢰구간 계산할 수 없음, 비모수적 방법 사용.   주소   수정/삭제   답글
  14. 익명이(가) 2021.09.17 00:09에 작성한 댓글:
    과제중인데 너무너무 감사합니다 ! 포스팅 정말 도움이 많이 되었어요 !   주소   수정/삭제   답글
  15. 익명이(가) 2021.12.11 16:30에 작성한 댓글:
이름
비밀번호
홈페이지
비밀여부