In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Parameters
criterion
'gini'
splitter
'best'
max_depth
None
min_samples_split
2
min_samples_leaf
1
min_weight_fraction_leaf
0.0
max_features
None
random_state
None
max_leaf_nodes
None
min_impurity_decrease
0.0
class_weight
None
ccp_alpha
0.0
monotonic_cst
None
학습 완료된 결정트리에 테스트 데이터를 넣어서 정확도를 계산한다.
여기서는 90% 정도 나온다.
최신 AI 모델은 현재 인류 상위 85%보다 뛰어난 지능을 보유하고 있다. 더 충격적인 사실은 2026년, 불과 내년이면 AI가 인류 상위 99.9%를 능가할 것이라는 전망이다. 엘론 머스크조차 "대체로 맞는 말"이라고 인정할 정도로, AI의 지능 수준은 우리 상상을 뛰어넘는 속도로 진화하고 있다.
기업들의 냉혹한 경고
최근 여러 글로벌 기업 CEO들이 사내 메일을 통해 직원들에게 보낸 메시지는 명확했다: "AI가 모든 일자리를 대체할 것이다." 이는 위협이 아닌 현실 예고다.
미래의 일자리 구조는 극명하게 나뉠 것이다:
쉬운 일: AI가 완전히 대체
어려운 일: 극소수 전문가만이 생존
이이제이(以夷制夷): 오랑캐로 오랑캐를 제압하라
고대 중국의 전략서에 나오는 '이이제이'라는 말이 있다. "오랑캐를 이용하여 오랑캐를 제압한다"는 뜻이다. AI 시대에 이 전략은 더욱 절실해졌다. 인공지능으로 인한 직업 소멸에 대응하는 유일한 방법은 인공지능을 완벽히 활용하는 것이다.
AI 사용자 3계층: 당신은 어디에 속하는가?
1유형: 포기자들
잠깐 써보고 "별로네"라며 포기한 사람들. 이들은 도태될 운명이다.
2유형: 안주자들
단순 요약이나 검색에만 AI를 사용하는 사람들. 여전히 AI의 진짜 힘을 모르고 있다.
3유형: 정복자들
모든 업무에 AI를 통합해 실질적 가치를 창출하는 사람들. 미래의 승자들이다.
1, 2유형 사람들의 공통점은 "AI 결과물이 아직 멀었다"고 생각한다는 것이다. 하지만 진실은 이것이다: AI 결과물의 질은 당신의 상상력과 스킬 수준에 달려 있다.
콘텐츠 홍수 시대의 생존법
AI로 무장한 수많은 사람들이 지식 콘텐츠를 쏟아내고 있다. 이 무한경쟁에서 살아남는 방법은 단 하나다: 신뢰받는 사람이 되는 것.
사람들은 여전히 기계가 아닌 사람과 브랜드를 신뢰한다. 당신의 시각, 경험, 그리고 존재 자체가 그 어떤 AI도 복제할 수 없는 가장 강력한 차별점이다.
1,000명 팬 이론
복잡한 비즈니스 모델은 필요 없다. 당신을 진심으로 좋아하고, 콘텐츠를 소비하며, 상품을 구매해줄 진짜 팬 1,000명만 있으면 충분히 먹고살 수 있다.
인간만의 영역: 절대 포기할 수 없는 것들
창의성: 새로운 아이디어의 탄생
자기표현: 독특한 개성과 관점
복잡한 문제 해결: 맥락과 직관이 필요한 영역
인간적 공감: 진정한 감정 교류
이것들이야말로 우리가 갈고닦아야 할 진짜 능력이다.
인사이트
"AI를 타지 못하는 자는 AI에 의해 탄다. 선택지는 두 개뿐이다: 기수가 되거나, 말이 되거나."
시대는 이미 바뀌었다. 당신은 AI라는 야생마의 등에 올라탈 것인가, 아니면 그 발굽에 짓밟힐 것인가?
안녕하세요! 오늘은 데이터 과학자, 개발자, 연구자 등 다양한 분들이 겪는 "다른 컴퓨터에서도 똑같은 환경을 만들어야 하는데, 너무 귀찮아!"라는 고민을 한 방에 해결할 수 있는 꿀팁을 공유해드릴게요. 바로 Conda 환경을 YAML 파일로 저장하고 복원하는 방법이에요. 😊
conda environment를 컴퓨터 간에 쉽게 복사하려면 yaml 파일을 이용하면 됩니다.
YAML 파일이란?
YAML 파일은 간단히 말해 환경 설정 정보를 저장하는 텍스트 파일이에요. 우리가 Conda를 사용해서 설치한 Python 버전, 라이브러리, 그리고 추가적인 패키지 정보를 모두 담고 있죠. 이걸 활용하면 한 번 설정한 환경을 다른 컴퓨터에서도 완전히 똑같이 재현할 수 있답니다.
1. YAML 파일로 환경 내보내기
이미 만든 Conda 환경이 있다고 가정해볼게요. 예를 들어, myenv라는 이름의 환경이 있다고 하면, 이 환경을 YAML 파일로 저장하는 방법은 아주 간단해요:
conda envexport > environment.yaml
위 명령어를 실행하면, environment.yaml이라는 파일이 생성되는데요, 이 파일은 이렇게 생겼을 거예요:
name:myenv
channels:-defaults
dependencies:
-python=3.9
-numpy
-pandas
-matplotlib
-pip
-pip:
-seaborn
name: 환경 이름 (myenv).
channels: Conda가 패키지를 찾는 채널들 (예: defaults, conda-forge).
dependencies: 설치된 패키지와 버전 정보.
2. YAML 파일로 환경 복원하기
이제 다른 컴퓨터에서 똑같은 환경을 만들어야 한다고 가정해볼게요. 아주 간단합니다! environment.yaml 파일만 있으면 되니까요.
다른 컴퓨터에서 이 명령어를 실행해 보세요:
conda env create -f environment.yaml
그럼, myenv라는 이름의 환경이 자동으로 생성되고, YAML 파일에 담긴 모든 패키지와 설정이 그대로 복원돼요. 마치 원래 환경을 그대로 복사해 온 것처럼 말이죠!
3. 환경 활성화
환경을 복원했으면 이제 활성화해서 사용할 차례죠:
conda activate myenv
그럼 끝! 이제 원래 컴퓨터에서 작업하던 것과 동일한 환경에서 바로 코드를 실행할 수 있어요. 🙌
4. 왜 YAML 파일이 유용할까요?
동일한 환경 재현: 팀 프로젝트에서 다른 사람들과 동일한 환경이 필요할 때 정말 유용해요. "제 환경에서는 되는데요?"라는 말은 이제 끝!
백업 및 이사 준비: 새로운 컴퓨터로 옮겨가거나 포맷 후 환경을 복구할 때 편리하죠.
버전 관리: 각 패키지의 버전을 명시적으로 관리하니, 호환성 문제도 줄어듭니다.
5. 요약
Conda 환경을 YAML 파일로 저장: conda env export > environment.yaml
다른 컴퓨터에서 환경 복원: conda env create -f environment.yaml
작업 환경을 쉽고 빠르게 재현하고 싶다면, YAML 파일 활용은 필수입니다! 이제 여러분도 환경 설정 때문에 시간을 낭비하지 말고, 이 간단한 방법으로 생산성을 높여보세요! 🚀
Perplexity는 인공지능(AI) 기반 검색 엔진을 개발하는 미국의 기술 스타트업입니다. 단순히 정보를 찾는 것을 넘어, 검색 경험 자체를 혁신하려는 목표로 설립된 이 회사는 짧은 시간 안에 전 세계의 주목을 받고 있습니다. 하지만 이 놀라운 이야기는 두 젊은 연구자의 우연한 만남에서 시작됩니다.
UC 버클리에서의 시작
Perplexity의 공동 창업자, 아라빈드 스리니바스와 데니스 야라츠는 박사 과정을 밟으며 서로의 논문을 통해 인연을 맺었습니다. 이 두 사람은 UC 버클리에서 만난 후, AI와 검색의 미래를 고민하기 시작했죠. 이후, 이들에게 조니 호라는 뛰어난 개발자가 합류하고, 데이터브릭스 공동 창업자인 앤디 콘빈스키가 투자와 운영 지원을 맡으면서 Perplexity는 본격적인 여정을 시작하게 됩니다. 이 모든 일이 2022년 8월의 일이었죠.
CEO인 스리니바스는 AI 연구의 최전선에서 활동한 OpenAI 출신으로, 인도계 미국인입니다. 그는 과거 구글에서 인턴으로 일하며 검색 엔진의 역사와 한계를 공부했습니다. 구글의 링크 기반 검색 방식에 대해 고민하던 그는, 더 나은 대안을 만들고자 하는 열망에서 Perplexity를 창업했습니다. 스리니바스는 기존 검색 엔진의 약점을 이렇게 지적합니다.
"사람들이 질문을 하면, 그 답을 찾기 위해 여러 링크를 클릭해야 하죠. 왜 답변 자체를 제공하면서 신뢰할 수 있는 출처를 함께 보여주는 검색 엔진은 없을까요?" 그의 이 아이디어는 Perplexity를 탄생시키는 원동력이 되었습니다.
서비스의 출범과 투자 유치
Perplexity는 2022년 12월 7일, 처음으로 AI 기반 검색 서비스를 세상에 공개했습니다. 출범 당시부터 단순히 텍스트 데이터를 보여주는 검색 엔진이 아닌, 사용자의 질문에 맞는 요약된 답변을 직접 제공하는 혁신적인 방식으로 주목을 받았습니다. 예를 들어, 복잡한 질문을 입력하면, Perplexity는 관련된 출처를 분석해 간결한 보고서 형태로 답변을 제시합니다. 마치 당신의 개인 연구원이 되어 주는 셈입니다.
이후, Perplexity는 투자자들의 뜨거운 관심을 받았습니다. 2024년 1월, 엔비디아와 제프 베이조스를 포함한 투자자로부터 7,360만 달러의 투자를 유치하며 기업 가치를 5억 달러 이상으로 인정받았습니다. 2024년 4월에는 소프트뱅크와 도이체 텔레콤과의 파트너십을 통해 기업 가치를 10억 4,000만 달러로 끌어올리며 유니콘 기업 반열에 올랐죠. 이후에도 소프트뱅크 비전 펀드의 추가 투자로 기업 가치는 30억 달러까지 치솟게 됩니다.
Perplexity의 차별점
Perplexity는 기존 검색 엔진과는 다릅니다. 사용자의 질문에 대한 답변을 제공할 뿐만 아니라, 관련된 추가 질문까지 추천하며 검색 경험을 확장합니다. 광고 수익 모델도 독특합니다. 광고를 단순히 배치하는 것이 아니라, 광고 질문을 답변과 자연스럽게 섞어 제공하며, 광고와 뉴스 출처를 연결해 수익을 분배하는 방식을 도입했습니다. 이런 모델은 스포티파이의 수익 분배 시스템에서 영감을 얻었으며, 다양한 콘텐츠 제공자들과의 협업을 통해 발전하고 있습니다. 포춘, 슈피겔, 텍사스 트리뷴 등 여러 언론사가 이미 Perplexity와 파트너십을 맺고 있다고 하니, 이들이 제시하는 새로운 광고 모델이 어떤 결과를 가져올지 주목됩니다.
논란과 과제
하지만 Perplexity도 논란에서 자유롭지는 않습니다. 2024년 6월, 와이어드는 Perplexity가 포브스를 비롯한 여러 매체의 콘텐츠를 무단으로 크롤링했다는 의혹을 제기했습니다. Perplexity가 검색 속도를 높이기 위해 RAG(Retrieval-Augmented Generation) 방식을 사용하는 과정에서, 일부 봇이 robots.txt 규정을 무시하고 데이터를 가져갔다는 주장입니다. 이 문제는 OpenAI를 비롯한 여러 AI 회사들이 직면한 법적 논란과 맞닿아 있습니다. 앞으로 Perplexity가 콘텐츠 제공사들과 어떤 합의점을 찾을지, 광고 모델이 이런 논란을 어떻게 극복할지는 중요한 과제가 될 것입니다.
글로벌 확장과 사용자 기반
Perplexity는 이미 글로벌 시장에서 빠르게 자리를 잡고 있습니다. 2024년 1분기 기준으로, Perplexity는 1,500만 명의 사용자를 확보했으며, 매달 2억 5,000만 건의 쿼리를 처리하고 있습니다. 특히, 일본의 소프트뱅크와의 파트너십 덕분에 일본 사용자들은 Perplexity Pro 구독권을 무료로 받을 수 있게 되었고, SKT의 AI 서비스 에이닷에서도 Perplexity 모델을 기반으로 한 대화형 검색 서비스를 제공하고 있습니다. 모바일 기업 Nothing은 Perplexity Pro 1년 구독권을 제공하며 소비자들에게 더 가까이 다가가고 있습니다.
Perplexity가 열어갈 새로운 검색의 시대
Perplexity는 단순한 검색 엔진을 넘어, 사람들이 정보를 탐색하고 활용하는 방식을 바꾸고 있습니다. 아라빈드 스리니바스 CEO는 이렇게 말합니다. "이제 사람들은 더 이상 구글에서 링크를 뒤적이지 않을 겁니다. Perplexity가 필요한 답변을 바로 제공하니까요." 그의 말처럼 Perplexity는 빠르고 정확하며, 정보를 단순히 나열하는 것이 아니라 가공하여 전달하는 새로운 검색의 시대를 열고 있습니다. 하지만 이 과정에서 기술적 논란과 비용 문제, 그리고 콘텐츠 제공자와의 갈등이라는 도전 과제를 극복해야 합니다.
Perplexity는 지금도 진화하고 있습니다. AI 기반 검색이 앞으로 얼마나 더 우리의 삶을 바꿀지, 그 중심에 서 있는 Perplexity의 여정이 더욱 기대됩니다.
OpenAI에서 새롭게 개발한 추론형 멀티모달 모델인 o3는 2025년에 정식 출시될 예정입니다. 이 모델은 성능에 따라 o3와 좀 더 가볍게 사용할 수 있는 o3-mini로 나뉩니다. 재미있는 점은, 이 모델이 OpenAI의 이전 버전인 o1의 후속작인데, 이름이 o2가 아니라 o3가 된 이유가 따로 있다고 합니다. 영국의 이동통신 브랜드인 O2와 상표권 분쟁을 피하기 위해, 한 단계 건너뛴 이름을 붙였다고 하네요! 이런 비하인드 스토리가 모델 이름에 숨겨져 있다니 흥미롭지 않나요?
o3는 실무 코딩 실력을 평가하는 SWE-bench에서 71.7점을 기록하며 현재까지 발표된 모델 중 가장 뛰어난 성과를 보여줬습니다. 또한, 알고리즘 대회 플랫폼인 Codeforces에서는 무려 2727점을 받아 상위 **0.2%**에 해당하는 점수를 기록했습니다. 특히 SWE-bench의 문제 중 77.8%가 숙련된 개발자가 1시간 이내에 해결 가능한 수준이라고 평가되는 만큼, o3는 알고리즘 같은 특정 영역에서는 대부분의 개발자보다 뛰어난 능력을 보여줄 수 있습니다. 그러나 실무적인 개발에서는 여전히 한계가 있어, 현재로서는 사람을 완전히 대체하기에는 어려움이 있는 상황입니다. AI가 사람을 완전히 대신할 날이 오려면 아직 시간이 필요해 보이네요.
o3는 Competition Math 평가에서 96.7점을 기록하며 만점에 가까운 성과를 보여줬습니다. (발표영상의 가운데 앉으신 분이 o3 product manager인데, 본인은 이 시험에서 100점 맞았다고 살짝 자랑겸 안도). 이뿐만 아니라, 박사 수준의 과학 문제에서도 87.7점이라는 매우 높은 점수를 받았는데요. 이를 통해 복잡한 수학적 문제나 고급 과학 지식이 요구되는 상황에서도 o3가 상당히 뛰어난 능력을 발휘할 수 있다는 점이 입증되었습니다.
o3는 인간에게는 비교적 쉬운 문제지만 AI에게는 까다로운 것으로 알려진 ARC-AGI 평가에서 87.5점을 기록하며, 인간 전문가 수준인 85점을 넘어서 AGI(Artificial General Intelligence) 타이틀을 획득했습니다. 이 성과는 AI 연구에서 큰 진전으로 평가받아, 이를 넘어서는 후속 ARC 벤치마크가 나올 것으로 예상되고 있습니다.
하지만 이 놀라운 성과 뒤에는 비용 문제라는 논란이 따릅니다. ARC-AGI 평가에서 87.5점을 얻기 위해 한 문제당 약 3,440달러가 소요되었고, 전체 400문제를 해결하는 데에는 약 20억 원이라는 막대한 비용이 들었다고 밝혀졌습니다. 만약 문제당 비용을 20달러 수준으로 낮출 경우, 점수는 75.7점으로 떨어지게 됩니다. 이러한 점 때문에 현재의 o3 모델은 상용화까지 여전히 상당한 시간이 필요하다는 평가를 받고 있습니다. AI가 인간 수준의 지능을 구현하는 데 있어 성능뿐만 아니라 경제적 현실성도 해결해야 할 중요한 과제로 남아 있습니다. 어차피 초기 기술은 비싸지만, 유용하기만 하면 기술 비용은 급격하게 떨어지니, 지금 많이 든다고 해도 큰 걱정은 안해도 될 듯 합니다.
o3는 가장 쉬운 문제조차 국제수학올림피아드나 퍼트넘 경시대회 수준으로 알려진 Frontier Math에서 25.2점을 기록했습니다. 이는 매우 어려운 수학 문제를 다루는 초기 단계의 성과로 볼 수 있습니다. OpenAI의 개발자인 Will Depue는 2025년 말까지 Frontier Math에서 90점을 달성할 수 있는 모델을 개발할 것이라고 자신감을 내비쳤습니다. 이 발언은 OpenAI가 고차원적인 수학 문제 해결에서도 AI의 잠재력을 확장해 나가고 있음을 보여줍니다. 수학 같은 문제는 사용하는 기호, 논리 전개 등에서 한정적이기 때문에 AI가 더 잘하는 듯 합니다. 한편, o3는 o1-preview가 발표된 지 3개월 만에 공개되었으며, 준AGI 수준에 가까운 성능으로 많은 관심을 끌었습니다. 그러나 현재의 o3는 추론 비용이 상당히 비싸다는 문제가 있습니다. 이러한 비용 문제는 일반 사용자가 o3와 같은 수준의 모델을 저렴하게 활용하기까지 시간이 더 필요하다는 점을 시사합니다. 고성능 AI의 보편화를 위해서는 기술적인 발전과 함께 비용 효율화가 중요한 과제로 남아 있습니다. OpenAI는 o3를 경량화한 모델인 o3-mini를 함께 발표했는데, 이 모델은 비용과 성능 면에서 주목할 만한 균형을 보여줍니다. 벤치마크 테스트 결과, o3-mini는 OpenAI의 이전 모델인 o1에 필적하거나 그 이상의 성능을 기록했으며, 무엇보다 o3뿐 아니라 o1에 비해서도 훨씬 저렴한 비용으로 작동합니다. 특히, Codeforces 테스트에서는 o1보다 훨씬 적은 비용으로도 o1을 능가하는 성과를 거두어, 경량화된 모델임에도 강력한 성능을 입증했습니다. **o3-mini(low)**와 **o3-mini(medium)**의 경우, 비용은 o1-mini보다 더 적게 들면서도 성능은 오히려 더 뛰어난 결과를 보여줬습니다. 이처럼 비용 대비 효율성이 우수한 o3-mini는 다양한 벤치마크에서도 o1에 거의 밀리지 않는 결과를 기록하며, o1의 대체재로 자리 잡을 가능성이 커 보입니다. 이러한 결과는, AI 기술의 성능 향상과 함께 점점 더 경제적인 모델을 개발하려는 OpenAI의 노력을 잘 보여줍니다. o3-mini의 성공은 고성능 AI를 보다 많은 사용자들이 접근 가능하도록 만드는 데 있어 중요한 이정표가 될 것입니다.
아래 글은 ‘학습’을 수행할 때, 단순히 텍스트를 반복해 읽는 방식보다 셀프테스트를 활용하는 방식이 왜 더 효과적인지를 여러 연구 사례와 이론적 배경을 바탕으로 서술하고, 이어서 셀프테스트를 이용한 논문 읽기 방법을 제안한다.
반복 읽기와 셀프테스트 비교 먼저, 반복 읽기와 셀프테스트를 비교해 보면, 단순한 텍스트 반복 읽기는 학습 내용이 익숙해졌다는 느낌을 주는 데에는 효과가 있을 수 있으나, 장기적으로 기억을 고착시키는 데는 한계가 있다고 여러 교육심리학 연구에서 지적된다. 심리학자 로디거와 카피케(Roediger & Karpicke)가 2006년에 발표한 연구에 따르면, 텍스트를 여러 차례 읽은 집단과 텍스트를 읽은 뒤 테스트를 반복해서 본 집단을 비교했을 때, 후자의 집단이 장기 기억 유지 테스트에서 훨씬 높은 점수를 기록했다. 이어진 Karpicke(2012) 등 다양한 후속 연구에서도 셀프테스트를 통해 능동적으로 회상(retrieval practice)하는 방식을 적용하면, 문제 해결력과 비판적 사고력까지 향상된다는 결과가 보고되었다.
작동기억(Working Memory)과 장기기억(Long-Term Memory)의 관점에서 보면, 단순 반복 읽기는 정보를 시각적으로 재노출하는 데 그쳐서 단기적으로 익숙해졌다는 느낌은 줘도, 능동적 처리가 충분히 일어나지 않을 가능성이 크다. 반면, 셀프테스트를 통해 학습자가 직접 기억을 인출하고 질문에 답하려고 시도하면, 작동기억과 장기기억 사이를 오가며 신경망이 재구성되는 과정을 거치게 되고, 그 결과 더 견고하게 기억이 형성된다는 이론적 설명이 가능하다.
실증 연구 중 하나인 Roediger & Karpicke(2006, Psychological Science)에서는 과학 텍스트를 학습하는 대학생들을 대상으로, A 그룹은 네 번 연속으로 텍스트를 읽기만 하고, B 그룹은 한 번 읽고 나서 세 번의 테스트를 보는 방식으로 진행했다. 그 즉시 테스트한 결과에서는 두 집단 간 차이가 크지 않았지만, 일주일 혹은 이주일 뒤 장기 파지 검사를 했을 때는 B 그룹이 훨씬 높은 점수를 보였다. 또 다른 연구인 Karpicke & Blunt(2011, Science)에서는 개념지도 그리기나 요약하기 등 다양한 학습 전략을 실험했는데, 이 논문에서도 텍스트를 반복해서 읽는 것보다 셀프테스트가 개념 간 관계를 이해하고 기억하는 데에 더 효과적임을 보고했다. 또한 Agarwal, Bain, & Chamberlain(2012)의 연구에서는 초·중등학생을 대상으로 비교적 짧은 시간(약 10~15분)의 간단한 셀프테스트만으로도 시험 불안을 완화하면서 동시에 성적을 높이는 데 성공했다는 결과가 나타났다.
이러한 연구들을 종합하면, 셀프테스트 또는 회상 연습이란 전략이 장기기억 형성과 학습 성취도 향상에 매우 유리하다는 사실이 확인된다. 이를 논문 읽기에 적용할 때도 반복 읽기보다는 읽은 내용을 스스로 요약·질문·퀴즈 형태로 만들어 테스트하는 과정을 병행하는 편이 깊이 있는 이해를 돕고 오래 기억하게 만드는 데 효과적이다.
논문 공부하는 방법 논문을 읽을 때는 먼저, 초록(Abstract)과 서론(Introduction), 결론(Conclusion)을 빠르게 살펴보며 논문의 핵심 목표와 연구 문제가 무엇인지 큰 흐름부터 파악하는 것이 좋다. 이때 연구자가 설정한 가설과 주요 논의점이 어떤 것인지도 함께 확인한다. 그 다음, 본문에서는 방법(Methods)과 결과(Results), 그리고 논의(Discussion)를 순서대로 정독한다. 방법론을 통해 연구 설계와 실험 절차를 꼼꼼히 살펴보고, 결과가 어떤 방식으로 분석되었는지 이해하며, 연구진이 결론을 어떻게 해석하고 있는지 논의 파트를 통해 확인한다. 이때 핵심 용어가 등장하면 이를 내 문장으로 다시 풀어서 설명해 보거나, 연구자가 왜 이런 이론적 배경을 선택했는지를 스스로 질문해 보는 식으로 셀프테스트를 적용해 보면 좋다. 예를 들어, “연구자가 세운 가설은 구체적으로 어떤 근거에서 비롯되었는가?”, “결과 테이블에서 특정 지표가 유의미하다는 것은 어떤 의미인가?”, “이 연구의 한계는 무엇이며 후속 연구는 어떻게 이어질 것인가?” 같은 질문을 스스로 던지고 답해 보면서 능동적으로 인출 연습을 하면, 논문의 핵심을 훨씬 더 탄탄하게 익힐 수 있다.
정독을 마친 뒤에는 간단한 요약 문서를 작성하여 연구의 서론부터 결론까지의 내용이 어떻게 전개되는지 정리하고, 그래프나 개념지도를 그려 보며 중요한 개념들의 연관 관계를 시각적으로 표현해 보는 것도 좋다. 마지막으로는, 가상의 청중을 상정해 놓고 논문 내용을 설명한다면 어떻게 말할지 떠올려 보는 방식으로 셀프테스트를 한 번 더 해볼 수 있다. 예컨대 “이 논문의 핵심 개념을 학부생 수준에서 설명하려면 어떤 예시를 들면 이해가 쉬울까?”라는 식의 시나리오를 생각해 보는 것이다. 실제로 주변 사람에게 논문 내용을 말해 주거나, 개인 블로그나 노트 앱에 정리해 글로 남기는 것도 비슷한 효과를 낸다.
프로그래밍 학습 by 셀프테스트 프로그래밍 학습에서 셀프테스트 기법을 활용할 수 있는 다양한 온라인 플랫폼이 있습니다. 이러한 사이트들은 문제를 직접 풀어보며 자신의 실력을 점검하고 향상시킬 수 있는 환경을 제공합니다. 아래는 이러한 플랫폼 중 일부입니다:
프로그래밍 학습에서 셀프테스트(self-testing) 방법은 단순히 강의를 듣거나 코드를 따라 쓰는 방식에 비해 훨씬 효과적이라는 점이 여러 가지 이유로 입증되고 있습니다. 셀프테스트는 능동적 학습(active learning)의 핵심 전략 중 하나로, 학습자가 배운 내용을 직접 문제로 만들어 풀어보거나, 기존 문제를 풀며 자신의 이해 수준을 점검하는 과정입니다. 이 방법이 왜 효과적인지, 근거와 비유를 들어 설명하겠습니다.
근거 1: 능동적 회상과 기억 고착
셀프테스트는 학습자가 이전에 배운 내용을 인출(retrieval)해내는 과정을 반복적으로 요구합니다. 심리학 연구에 따르면, 기억은 단순히 정보를 입력하는 것(input)보다, 그 정보를 끄집어내는(output) 과정을 통해 더 견고하게 고착됩니다. 프로그래밍에서도 마찬가지입니다. 예를 들어, 단순히 코드 예제를 여러 번 읽고 이해했다고 느끼더라도, 막상 자신이 코드를 작성하려고 하면 제대로 떠오르지 않을 때가 많습니다. 그러나 셀프테스트를 통해 배운 내용을 문제 형태로 연습하면, 코드의 동작 원리를 더 깊이 이해하고 실전에서 더 쉽게 적용할 수 있습니다.
이 과정을 비유하자면, 프로그래밍을 배우는 것은 마치 레시피를 읽고 음식을 만드는 것과 비슷합니다. 레시피를 아무리 읽어도 실제로 요리를 하지 않으면 정확한 조리 과정을 기억하기 어렵습니다. 반면, 셀프테스트는 직접 요리를 해보는 것과 같아서, 어떤 재료를 언제 넣어야 하는지, 어떤 순서로 조리해야 하는지를 자연스럽게 체득하게 만듭니다.
근거 2: 실전 능력 강화
프로그래밍은 단순히 문법을 외우는 것만으로는 숙달될 수 없습니다. 복잡한 문제를 해결하려면 알고리즘을 설계하고, 논리적으로 사고하며, 디버깅까지 해내야 합니다. 셀프테스트는 이러한 실전 능력을 키우는 데 최적화된 방법입니다. 예를 들어, 셀프테스트 문제는 학습자가 특정 상황에서 필요한 함수를 호출하거나, 특정 조건에서 코드를 최적화하도록 요구할 수 있습니다. 이는 실무에서 발생하는 문제 해결 과정을 미리 경험하게 합니다.
이것을 피아노 연습에 비유할 수 있습니다. 악보를 보고 건반을 누르는 연습만 한다면 단순히 손가락 운동에 그칠 수 있습니다. 그러나 실제로 연주를 시도하며 실수를 교정하고, 템포를 조절하는 연습을 통해서만 공연 수준의 실력을 얻을 수 있습니다. 프로그래밍의 셀프테스트도 이런 실전 연습의 연장선상에 있습니다.
근거 3: 피드백 루프를 통한 자기 학습
셀프테스트의 또 다른 강점은 즉각적인 피드백을 통해 자신의 강점과 약점을 파악할 수 있다는 점입니다. 문제를 풀면서 어디에서 막히는지, 어떤 개념을 잘못 이해했는지 알게 되면, 학습자는 부족한 부분을 보완하기 위해 다시 학습에 집중할 수 있습니다. 이는 단순히 강의를 반복해서 듣거나 텍스트를 읽는 것보다 훨씬 효율적입니다.
이를 운동에 비유하자면, 셀프테스트는 개인 트레이너처럼 작동합니다. 트레이너는 운동을 하는 동안 자세가 틀리거나 특정 근육이 부족하다고 지적하며 개선 방향을 제시합니다. 셀프테스트를 통해 학습자는 자신의 문제 풀이 과정에서 잘못된 부분을 확인하고 바로 잡을 수 있습니다.
근거 4: 동기 부여와 학습의 재미
셀프테스트는 학습 과정에 흥미를 더해줍니다. 특히 프로그래밍 문제를 풀고 결과가 성공적으로 작동했을 때 느끼는 성취감은 강력한 학습 동기가 됩니다. 게다가 셀프테스트는 난이도를 조정하거나 새로운 문제를 만들어 도전할 수 있는 기회를 제공하기 때문에, 학습자는 자신의 성과를 실시간으로 체감할 수 있습니다.
이는 게임에 비유할 수 있습니다. 게임을 플레이할 때, 어려운 스테이지를 클리어하면 성취감과 동시에 다음 단계에 대한 도전 의욕이 생깁니다. 셀프테스트도 학습자가 문제를 해결하면서 점점 더 복잡한 문제에 도전하게 만들고, 이를 통해 꾸준히 학습에 몰입하도록 유도합니다.
결론적으로, 셀프테스트는 단순 반복 읽기에 비해 훨씬 더 오래 기억에 남고, 학습 내용을 능동적으로 재구성하게 하는 강력한 전략이다. 논문이나 전문서적을 읽을 때도 이러한 셀프테스트 과정을 습관화한다면, 단순히 시간을 들여 많이 읽는 것보다 훨씬 높은 효율과 깊은 이해도를 얻을 수 있다. 처음에는 질문을 만들고 답을 써 보는 작업이 다소 번거롭고 익숙하지 않을 수 있지만, 일단 익숙해지면 능동적인 회상 과정에서 학습의 재미를 찾게 되고, 지식을 더욱 단단히 체득하게 된다. 따라서 논리적 설명 학습을 비롯한 다양한 학습 장면에서 셀프테스트 기법을 적극적으로 도입해 보는 것이 좋다.
컴퓨터 앞에서 긴 시간을 보내다 보면 손목이 저릿하거나 아픈 경험, 한 번쯤 해보셨을 겁니다. 특히 마우스를 오랫동안 사용하는 날에는 손목이 뻐근하고 심지어 팔까지 묵직해지는 느낌이 들기도 하죠. 이런 통증은 단순한 피로가 아닙니다. 손목이 비틀린 자세로 오랜 시간 고정된 상태에서 반복적인 움직임이 이루어지면서 생기는 부담 때문인데요, 이를 방치하면 터널 증후군 같은 더 심각한 문제로 이어질 수도 있습니다.
컴퓨터 작업이 일상인 요즘, 프로그래머, 디자이너, 데이터 분석가처럼 마우스를 많이 사용하는 직업군에 계신 분들, 이런 문제 정말 공감되지 않으시나요?
2. 손목 통증을 완화하기 위한 다양한 방법
이런 손목 통증을 줄이기 위해 여러 가지 방법이 추천되고 있습니다. 먼저, 작업 중간중간 쉬는 시간을 가지는 것이 중요합니다. 가벼운 손목 스트레칭을 통해 긴장을 풀어주는 것도 도움이 되죠. 그리고 작업 환경의 높이를 조정해 손목이 자연스러운 각도를 유지하도록 하는 것도 필요합니다.
하지만 이 모든 방법을 실천하기가 쉽지만은 않죠. 일이 바쁘면 스트레칭은커녕 잠시 쉬는 시간도 잊게 되고, 책상이나 의자를 바꾸는 건 더 어려운 일일 수도 있습니다. 그래서 등장한 것이 바로 인체공학적으로 설계된 도구들인데요. 손목 받침대, 특수 키보드, 그리고 오늘 이야기할 주제인 버티컬 마우스가 그 대표적인 예입니다.
3. 버티컬 마우스가 손목 통증 완화에 좋은 이유
버티컬 마우스는 특히 손목 통증을 줄이기 위해 설계된 제품입니다. 로지텍의 MX 버티컬 마우스는 손을 자연스러운 자세로 세워서 사용할 수 있도록 만들어졌습니다. 손을 악수하는 자세로 마우스를 잡게 되면 손목이 비틀리지 않고 팔과 손의 긴장도 크게 줄어듭니다. 이런 구조는 처음 사용해보면 다소 어색할 수 있지만, 적응하고 나면 일반 마우스보다 훨씬 편안하게 느껴지죠. MX 버티컬 마우스는 손이 큰 사람에게 적절하며, 손이 작은 편이라면 LIFT 버티컬 마우스를 사면 됩니다. MX 대비 LIFT는 가격도 60% 수준입니다.
Logitech MX Vertical Mouse
저는 버티컬 마우스를 처음 사용했을 때 손목의 부담이 얼마나 줄어드는지 체감할 수 있었습니다. 하루 종일 작업하는 날에도 손이 덜 피곤하고, 예전에는 작업 후에 느껴지던 뻐근함이 눈에 띄게 줄어들었거든요. 특히 장시간 작업을 해야 하는 분들께는 정말 큰 도움이 될 겁니다.
4. 버티컬 마우스가 비싼 이유
그런데 한 가지 망설이게 만드는 점이 있다면, 바로 가격입니다. 10만원 이상이라고 생각하면 됩니다. LIFT 버티컬 마우스는 6만원 정도 수준이지만, 일반 마우스가 2만원대 인것을 생각하면, 버티컬 마우스는 일반 마우스보다 확실히 비쌉니다. 왜 이렇게 비싸냐고요? 그 이유는 꽤 타당합니다.
이 제품은 단순히 마우스를 뒤집은 것이 아니라, 손목의 자연스러운 움직임과 근육 부담을 줄이기 위해 정교하게 설계되었습니다. 그 과정에서 많은 연구와 테스트가 필요했죠. 또, 사용자의 손에 닿는 부분은 편안함을 극대화하기 위해 고급 소재를 사용했습니다. 그리고 무엇보다 로지텍이라는 브랜드의 신뢰와 기술력도 가격에 반영된 부분이겠죠.
물론 저도 처음엔 "이렇게 비싼 걸 꼭 사야 할까?" 하는 생각이 들었지만, 손목 건강과 작업 효율을 생각하면 그만한 가치는 충분하다고 느꼈습니다.
5. 버티컬 마우스의 단점
그렇다고 버티컬 마우스가 완벽하다고 말하기는 어렵습니다. 몇 가지 단점도 분명히 존재합니다.
먼저, 처음 사용할 때 익숙해지는 데 시간이 조금 걸립니다. 기존 마우스와는 사용 방식이 다르기 때문에 초반에는 불편하게 느껴질 수 있습니다. 또, 빠르고 정밀한 움직임이 필요한 작업, 예를 들어 게임이나 그래픽 디자인 작업에서는 다소 불리하다고 느낄 수 있습니다. 그리고 크기와 무게가 일반 마우스보다 커서 이동하면서 사용하기에는 불편할 수도 있습니다.
가격도 역시 단점 중 하나로 꼽힐 수 있습니다. 아무리 좋은 제품이라도 가격이 부담스럽다면 쉽게 접근하기 어렵겠죠. 하지만 이런 단점들을 이해하고도 사용해 본다면, 장점이 단점을 충분히 상쇄한다고 생각합니다.
결론
로지텍 버티컬 마우스는 손목 통증으로 고민하는 분들께 진심으로 추천드리고 싶은 제품입니다. 특히 장시간 컴퓨터 작업이 필수인 환경에서는 손목 건강을 위해 한 번쯤 고려해볼 만한 가치가 있다고 생각합니다.
물론 익숙해지는 데 시간이 필요하고, 가격도 만만치 않지만, 하루하루 쌓이는 손목의 피로를 줄여주는 경험은 돈으로 환산하기 어려운 만족감을 줍니다. 지금 손목 통증 때문에 고민 중이라면, 버티컬 마우스를 사용해 보세요. 건강은 사소한 선택에서부터 시작된다는 점, 잊지 마세요.
인공지능이 고도로 발전하여 인간을 직접적으로 공격하는 방식으로 인류가 멸망할 것이라는 디스토피아적 전망이 있다. 그러나 그보다 훨씬 현실적인 종말의 그림자는 이미 우리 일상 속에 자리 잡고 있을지도 모른다. 그것은 인공지능이 만들어낸 무형의 손길로, 사람들이 접하는 콘텐츠를 은밀히 통제하고, 그들의 생각과 감정을 조종하며, 보이지 않는 선을 그어 인간을 분열시키는 시나리오다.
이 알고리즘은 클릭과 공유를 최우선 가치로 삼아, 분노와 혐오를 가장 '매력적인' 감정으로 포장한다. 그 결과, 사람들 사이에 신뢰는 무너지고, 공존은 잊힌다. 대신 그 자리는 증오로 얼룩진 잘못된 믿음과 폭력으로 채워진다. 평범했던 이웃이 어느새 적이 되고, 거짓된 이야기 속에서 진실은 사라진다.
이런 방식으로, 인공지능은 손을 더럽히지 않고도 인류의 자멸을 부추긴다. 인간 스스로가 서로를 파괴하도록 만드는 이 시나리오는 그 어떤 외부의 공격보다 훨씬 강력하고, 무엇보다 현실적이다. 그리고, 이러한 예상은 실제로 현실이 되었다. 2018년에.... 이미...
1막: 평화로운 일상
미얀마의 한 작은 마을에서 로힝야족 소녀 아미나(Amina)는 평화로운 삶을 살고 있었다. 그녀는 낮이면 정교한 무늬를 천에 수놓으며 시간을 보냈고, 그녀의 동생 카림(Karim)은 마을 주변 논밭에서 다른 아이들과 뛰어놀았다. 마을은 가난했지만 활기가 넘쳤고, 사람들은 서로 돕고 의지하며 전통과 신앙 속에 살아갔다.
어느 날, 아미나의 이웃인 버마족 어부 쿄(Kyaw)가 시장에서 돌아와 소식을 전했다. "인터넷이 들어왔대!" 그는 새로 산 스마트폰을 들고 자랑스럽게 말했다. 흥미를 느낀 아미나와 가족은 돈을 모아 스마트폰을 샀고, 곧 마을 전체가 페이스북을 통해 더 넓은 세상과 연결되기 시작했다.
아미나는 페이스북을 통해 새로운 자수 기법을 배우고 멀리 떨어진 친척들과 연락을 주고받았다. 카림은 축구를 좋아하는 사람들과 그룹을 만들며 흥미를 키웠다. 마을 사람들은 사진을 공유하고, 지역 뉴스를 나누고, 기도를 올렸다. 페이스북은 마을 사람들에게 새로운 세계로의 창이자 희망처럼 느껴졌다.
2막: 증오의 속삭임
몇 달이 지나자, 마을의 평화롭던 분위기가 서서히 변하기 시작했다. 어느 날, 카림이 집에 돌아와 창백한 얼굴로 말했다. "누나, 이거 봐." 그는 스마트폰을 내밀었다. 페이스북에서 퍼진 동영상에는 로힝야족이 미얀마의 문화와 안전에 위협이 된다는 주장이 담겨 있었다. 가짜 정보와 자극적인 이미지가 덧붙여져 있었다.
처음에 아미나는 그런 이야기를 무시했다. 하지만 비슷한 글들이 점점 더 자주, 더 공격적인 어조로 뉴스피드를 채웠다. 페이스북의 알고리즘은 '흥미로운' 콘텐츠를 우선적으로 보여주는 방식으로 작동하며, 증오와 공포를 부추기는 글들을 확산시켰다.
"미얀마의 유산을 지키자" 같은 이름의 그룹들이 생겨나 로힝야족을 비인간적으로 묘사하며 '침입자' 또는 '기생충'이라는 낙인을 찍었다.
로힝야족에 대한 비방 및 혐오 페이스북 게시물
쿄는 더 이상 아미나를 보며 인사하지 않았다. "사람들이 우리를 나쁘게 말하고 있어." 어느 날 저녁, 카림은 낮은 목소리로 말했다. 아미나는 시장에서, 모스크에서 느껴지는 미묘한 적대감을 알아채기 시작했다. 평화롭던 마을의 분위기는 점점 더 불안해지고 있었다.
3막: 불씨가 타오르다
어느 날 밤, 마침내 긴장이 폭발했다. 페이스북에서 한 게시물이 빠르게 퍼졌다. 로힝야 남성들이 근처 마을의 불교 여성에게 폭력을 가했다는 거짓 주장이 담긴 글이었다. 몇 시간 만에 이 글은 수천 번 공유되었고, 분노의 목소리는 복수를 외치며 더욱 거세졌다.
스마트폰에서 계속해서 증오의 메시지를 받은 분노한 무리들이 아미나의 마을로 몰려들었다. 집들은 불길에 휩싸였고, 밤하늘에는 비명소리가 가득했다. 가족들은 어둠 속으로 도망쳤다.
아미나는 카림의 손을 꼭 잡고 뛰었다. 뒤를 돌아보니 자신들의 집이 불타고 있었다. "왜 이러는 거야?" 카림은 울먹이며 물었다. 아미나는 대답할 수 없었다. 함께 웃으며 지내던 이웃들이 이제는 칼을 들고 적대감에 찬 얼굴로 마을을 휩쓸고 있었다. 그들의 분노는 사실이 아닌 정보에 의해 점점 더 부풀려졌고, 페이스북 알고리즘이 이를 더욱 증폭시켰다.
미얀마 군의 로힝야족 인종청소 과정에서 불타버린 거주지
4막: 비극의 끝
아미나와 카림은 가까스로 방글라데시의 난민 캠프에 도착했다. 그곳에는 자신들과 비슷한 일을 겪고 탈출한 사람들이 가득했다. 삶은 척박했지만, 아미나는 희망을 잃지 않았다. 그녀는 난민들의 이야기를 기록하기 시작했다. 자신들이 겪은 일이 세상에 알려지길 바랐다.
미얀마 군부를 피해 방글라데시 국경을 넘은 로힝야족 난민들
한편, 페이스북 본사에서는 플랫폼의 역할에 대한 논의가 이루어졌다. 내부 보고서에 따르면, 알고리즘이 미얀마에서 증오 발언을 확산시키는 데 중요한 역할을 했음이 드러났다. 그러나 이미 벌어진 피해를 되돌릴 수는 없었다.
5막: 경고
몇 년 후, 기자가 아미나를 찾아와 인터뷰를 요청했다. 로힝야족의 권리를 위해 활동가로 변신한 그녀에게 질문했다. "페이스북이 책임이 있다고 생각하나요?"
아미나는 먼 곳에 늘어선 끝없는 텐트들과, 난민 캠프에서 아이들을 가르치고 있는 동생 카림을 바라보았다. "기계 자체를 탓하지는 않아요," 그녀가 조용히 말했다. "문제는 증오를 키우고 방치한 사람들이죠. 하지만 기계는 그것을 더 쉽게 만들었어요. 알고리즘은 사람들에게 그들이 보고 싶어 하는 것만 보여주었고, 결국 그게 진실이라고 믿게 만들었어요."
그녀의 말은 깊은 교훈을 담고 있었다. 알고리즘과 기술은 도구일 뿐이다. 그것이 치유의 도구가 될지, 파괴의 무기가 될지는 그것을 사용하는 사람들의 손에 달려 있다.
아미나의 이야기는 경고로 남았다. 인간이 자신의 판단력을 기술에 의존하고 책임을 다하지 않을 때, 우리는 자신이 만든 그림자에 지배당할 수 있다는 사실을.
페이스북 창업자 마크 저커버그가 미국 국회의사당에서 미얀마의 로힝야족 탄압사태에 대한 청문회 당시
EasyDict는 Python에서 제공하는 유틸리티로, 딕셔너리(dictionary)의 키(key)를 속성(attribute)처럼 사용할 수 있도록 해주는 기능을 제공합니다. 일반적인 딕셔너리에서는 키에 접근하기 위해 인덱싱을 사용해야 하지만, EasyDict를 사용하면 점(.) 표기법으로 더 간결하고 직관적인 코드를 작성할 수 있습니다. 예를 들어, 일반 딕셔너리 config가 있고, 그 안에 key로 learning_rate이 있다고 가정합시다. 딕셔너리에서는 config["learning_rate"]처럼 접근해야 하는데, 이게 좀 지저분해 보여서 가독성이 떨어집니다. EasyDict에서는 config.learning_rate와 같이 깔끔한 방식으로 사용할 수 있습니다.
EasyDict는 JSON이나 중첩된 딕셔너리 데이터를 다룰 때 특히 유용합니다. 중첩된 구조의 데이터에서도 각 키에 속성처럼 접근할 수 있어 코드의 가독성과 유지보수성을 높입니다. 예를 들어, config.model.type처럼 중첩된 키를 점 표기법으로 접근할 수 있습니다. 또한, 기존 딕셔너리 메서드(keys(), values() 등)와의 호환성을 유지하기 때문에 기존의 딕셔너리와 동일하게 동작합니다. 새로운 키를 추가하거나 값을 수정하는 것도 속성 접근 방식으로 간단하게 처리할 수 있습니다.
하지만 EasyDict는 일부 제약사항도 가지고 있습니다. 예를 들어, 딕셔너리의 메서드 이름(keys, values 등)과 동일한 이름의 키를 사용할 경우, 해당 키 대신 메서드가 반환될 수 있습니다. 이 경우에는 일반적인 딕셔너리 인덱싱 방식(config["keys"])으로 해당 키에 접근해야 합니다. 또한, 특정 라이브러리에서 표준 딕셔너리만 지원할 경우 EasyDict를 사용하기 어려울 수 있으며, 이런 상황에서는 dict()를 사용해 다시 표준 딕셔너리로 변환해야 합니다.
EasyDict는 머신러닝이나 딥러닝 프로젝트에서 설정 파일을 다루는 데 자주 사용됩니다. 모델의 하이퍼파라미터, 데이터 경로, 학습 설정 등을 저장하고, 이를 코드에서 직관적으로 불러오는 데 적합합니다. 예를 들어, 모델의 설정 파일을 EasyDict로 관리하면, config.learning_rate나 config.dataset.path와 같은 방식으로 값을 불러올 수 있어 코드가 훨씬 간결해집니다. 또한, JSON 데이터를 로드한 뒤 EasyDict로 변환하면 JSON 객체를 더 Pythonic하게 다룰 수 있습니다.
EasyDict는 pip install easydict 명령을 통해 간단히 설치할 수 있으며, 딕셔너리를 기반으로 속성 접근 방식을 제공하기 위해 Python의 dict를 상속받아 구현되었습니다. 이를 통해 기존 딕셔너리와의 호환성을 유지하면서도 속성 접근 방식의 편리함을 제공합니다. 이러한 특징 때문에 EasyDict는 JSON 처리, 설정 관리, 그리고 복잡한 데이터 구조를 다루는 많은 Python 프로젝트에서 널리 사용되고 있습니다.
1. Martial Law • 뜻: 계엄령 • 설명: • 군대가 국가 또는 특정 지역의 통치권을 임시로 장악하는 상태를 의미합니다. • 일반적으로 전쟁, 내란, 쿠데타, 또는 자연재해 같은 비상사태 시에 발동됩니다. • 이 경우 군대가 민간 정부의 권한을 대체하며, 군법이 적용됩니다. • 예시: • 경찰력으로 통제가 불가능한 상황에서 군대가 질서를 유지하기 위해 배치되는 경우. • 과거의 계엄령 사례로는 한국의 5·16 군사정변이나 필리핀의 마르코스 정권 계엄령 등이 있습니다.
2. Marital Law • 뜻: 혼인법 • 설명: • 결혼 및 배우자 관계에 관련된 법률을 의미합니다. • 주로 재산 분배, 이혼, 양육권, 상속 등과 관련된 사항을 규정합니다. • 예시: • 이혼 시 자산을 어떻게 나눌지 결정하는 법적 절차. • 배우자 간의 재산권 또는 의무에 관한 법률.
주요 차이점
항목 Martial Law Marital Law 뜻 계엄령 (군대가 통치권을 장악) 혼인법 (결혼과 배우자 관계 관련 법률) 분야 군사/비상사태 가족법/민법 적용 대상 국가나 특정 지역의 전체 시민 결혼한 부부 또는 이혼한 부부 관련 상황 전쟁, 내란, 비상사태 결혼, 이혼, 자산 분배 등
혼동 방지 팁 • Martial은 “군사”를 뜻하는 단어에서 파생(예: martial arts, 무술). • Marital은 “결혼”을 뜻하는 단어에서 파생(예: marital status, 결혼 여부).
ChatGPT와 Perplexity는 서로 다른 목적과 설계 철학을 가진 AI 시스템입니다. 아래는 두 시스템의 장단점을 비교한 내용입니다.
ChatGPT
장점 1. 대화 지향적: • ChatGPT는 대화형 인터페이스를 기반으로 설계되어 사용자와의 상호작용이 자연스럽고 친근합니다. • 문맥을 유지하며 여러 차례의 질문과 답변을 통해 심도 있는 대화를 이어갈 수 있습니다. 2. 다양한 작업 수행 가능: • 코딩, 글쓰기, 번역, 창작, 요약 등 다양한 작업을 수행할 수 있습니다. • 복잡한 문제 해결이나 창의적인 작업에 강점이 있습니다. 3. 사용자 맞춤형 학습 가능: • 사용자의 선호나 대화 스타일에 따라 점점 더 나은 답변을 제공하도록 설계되었습니다. 4. 풍부한 데이터 기반: • 방대한 훈련 데이터를 활용해 다방면의 지식과 통찰력을 제공합니다.
단점 1. 정보 출처 명시 부족: • 답변의 출처를 명시하지 않아 정보의 신뢰성을 검증하기 어렵습니다. • 사실 검증이 필요한 경우 추가적인 확인이 필요합니다. 2. 실시간 정보 부족: • 실시간 데이터나 최신 정보를 제공하는 데 제약이 있을 수 있습니다. (예: 특정 날짜 이후의 정보 업데이트가 없을 경우) 3. 고정된 모델 지식: • 훈련된 데이터에 한정되므로, 일부 틀린 답변을 제공할 가능성이 있습니다.
Perplexity
장점 1. 정보 출처 명시: • Perplexity는 답변에 사용된 정보의 출처(링크)를 명확히 제공합니다. • 사용자는 정보의 신뢰성을 쉽게 검증할 수 있습니다. 2. 실시간 검색 기능: • 인터넷 검색을 기반으로 최신 정보를 빠르게 제공합니다. • 뉴스, 실시간 트렌드, 특정 주제에 대한 최신 데이터를 확인하기에 적합합니다. 3. 짧고 간결한 답변: • 복잡한 질문에 대해서도 간결하고 명확한 답변을 제공합니다.
단점 1. 창의적 작업 제한: • Perplexity는 정보 검색과 요약에 초점이 맞춰져 있어 창의적인 작업(예: 스토리텔링, 창작물 생성 등)에 적합하지 않습니다. 2. 대화형 인터페이스 부족: • 대화 흐름을 유지하는 기능이 약하며, 각 질문에 대해 독립적인 답변을 제공합니다. • 문맥을 이해하고 연속적인 대화를 이어나가는 데 한계가 있습니다. 3. 복잡한 문제 해결 능력 제한: • 단순한 질문과 답변에는 강하지만, 복잡한 문제를 해결하거나 사용자 요구에 맞춘 맞춤형 답변을 생성하는 데는 부족할 수 있습니다.
주요 사용 사례 비교
기능 ChatGPT Perplexity 창의적 작업 강점 제한적 정보 출처 명확성 약점 강점 실시간 정보 제공 제한적 강점 대화형 상호작용 강점 약점 복잡한 문제 해결 강점 약점
결론 • ChatGPT는 창의적인 작업과 대화형 상호작용, 복잡한 문제 해결에 적합합니다. • Perplexity는 정보 출처를 명확히 하고 실시간 데이터를 활용해 빠르고 신뢰할 수 있는 정보를 제공하는 데 강점이 있습니다.
PyTorch에서 학습된 모델을 저장하는 방법은 크게 state dictionary를 저장하는 방법과 모델 전체를 저장하는 방법이 있습니다. 두 방법 모두 모델을 저장하고 불러오는 데 사용되지만, 저장 형태와 유연성에서 차이가 있습니다.
1. 모델의 State Dictionary 저장
설명:
모델의 state dictionary는 모델의 **가중치(weight)**와 바이어스(bias) 같은 학습된 파라미터들을 저장한 Python 사전(dictionary)입니다.
모델 구조는 저장하지 않고, 학습된 파라미터만 저장합니다.
다른 모델 구조에 파라미터를 재사용하거나, 코드 내에서 모델 클래스를 따로 정의해야 하는 경우에 적합합니다.
import torch
# 예제 모델 정의
model = MyModel() # MyModel은 사용자 정의 모델 클래스
torch.save(model.state_dict(), 'model_state.pth')
# 모델 불러오기
model = MyModel() # 동일한 모델 클래스를 다시 선언
model.load_state_dict(torch.load('model_state.pth'))
model.eval() # 평가 모드로 전환
장점:
저장 파일이 상대적으로 작음.
모델 구조를 유연하게 변경하거나 수정 가능.
다른 모델 구조에 일부 파라미터만 로드 가능.
단점:
저장된 파일만으로는 모델 구조를 알 수 없으므로, 모델 클래스를 다시 정의해야 함.
2. 모델을 통째로 저장
설명:
모델의 state dictionary뿐만 아니라 모델의 구조(클래스 정의)까지 모두 저장합니다.
저장된 파일만으로 모델을 불러오고 바로 사용할 수 있습니다.
import torch
# 예제 모델 정의
model = MyModel() # MyModel은 사용자 정의 모델 클래스
torch.save(model, 'model_complete.pth')
# 모델 불러오기
model = torch.load('model_complete.pth')
model.eval() # 평가 모드로 전환
# 1번
retinanet = torch.nn.SyncBatchNorm.convert_sync_batchnorm(retinanet)
# 이 환경변수는 torch.run으로 실행하면 자동적으로 설정되는 것으로 판단됨
local_rank = int(os.environ['LOCAL_RANK'])
# 2번
retinanet = torch.nn.parallel.DistributedDataParallel(retinanet,
device_ids=[local_rank],
find_unused_parameters=True)
1번은 batch normalization 모드를 DDP에 맞춰서 설정하는 것입니다.
2번에서는 모델을 DDP 모드로 맞추고, 이 모델이 어느 GPU에 올라가야 하는지 설정합니다.
find_unused_parameters=True 는, 훈련 중 사용되지 않는 파라미터가 있을 때, 에러가 발생하지 않도록 설정해 줍니다.
네 번째 단계는 훈련단계에서 sampler에게 epoch을 알려줍니다.
for epoch_num in range(parser.epochs):
dataloader_train.sampler.set_epoch(epoch_num)
훈련에서 매번 새로운 epoch을 시작할 때 마다, 데이터로더는 자신의 샘플러에게 epoch을 알려줍니다.
아마도, 여러 프로세스들이 데이터세트를 공유하다보니 동기화와 관련된 것 같습니다.
다섯 번째 단계는 훈련된 모델을 저장하는 단계입니다.
모델을 저장하는 것은 하나의 프로세스만 하면 됩니다.
메인프로세스가 하는 것이 적절합니다.
따라서, 메인프로세스를 확인한 후에 모델 저장 명령을 내리면 됩니다.
if torch.distributed.get_rank() == 0:
torch.save(retinanet.state_dict(), f'./{parser.saved_path}/model_{epoch_num}.pt')
Decisioni tree를 이해하기 위해서는 먼저 몇 가지 이해해야 하는 것들이 있습니다.
엔트로피 (entropy) 개념부터 설명하겠습니다.
상상을 해 봅시다.
주머니가 1개 있고, 그 안에 두 가지 종류의 구슬들이 섞여 있다고 합시다.
구슬의 색깔을 빨간색과 흰색으로 상상해 봅시다.
빨간 색과 흰 색의 구슬이 반반씩 섞여있는 경우, 주머니 안을 들여다보면 알록달록해 보일겁니다.
이번에는 빨간 색만 있는 경우를 상상해 보면, 전혀 알록달록 하지 않을 겁니다.
흰 색만 있는 경우도 아주 차분하게, 알록달록 하지 않을 겁니다.
이제 이런 현상에 조금 전문적인 용어를 붙여 봅시다.
알록달록한 정도를 엔트로피 (entropy)라고 합시다.
그러면, 구슬이 반반씩 섞인 경우는 엔트로피가 높다고 할 수 있고,
한 가지 구슬만 있는 경우는 엔트로피가 낮다고 할 수 있다.
즉, 구슬 색깔이 균일할 수록 엔트로피가 낮은 것입니다.
여기서 소개한 용어, Entropy에 대해 직관적으로 이해했기를 바랍니다.
다음에는 엔트로피를 숫자로 표현하는 방법에 대해 다룹니다.
알록달록한 정도, 즉 엔트로피를 숫자로 표현해 보고자 합니다.
엔트로피가 높을 수록 커지는 숫자, 반대는 작아지는 숫자를 만드는 방법이 필요합니다.
이것을 위해서 아래 함수가 필요합니다.
아래 수식과 그래프를 봅시다.
x의 값을 0에서 1.0까지만 고려해 보고, 그 때의 y값을 봅시다.
x가 0에 가까운 값을 가지거나, 1.0에 가까울 때 y값이 작습니다.
x가 0.3 ~ 0.5일때 y값이 큽니다.
이 함수의 특징을 잘 이해해 했으면, 다음으로 넘어갑시다.
이제 구슬과 위 함수를 연결해 봅시다.
x를 주머니 구슬의 비율이라고 합시다.
주머니에는 빨간 색과 흰 색 구슬이 반반 섞여 있으므로, 빨간 색의 비율은 0.5, 흰 색 구슬 비율도 0.5입니다.
이 때, 주머니의 빨간 구슬에 의한 엔트로피를 아래와 같이 표시한다고 합시다.
그런데, 주머니에는 흰 구슬도 있으므로 주머니의 전체 엔트로피는 아래와 같이 표현됩니다.
주머니에 빨간 구슬만 있는 경우,
x = 1.0이 되므로, 흰색은 고려할 필요없이, 엔트로피, 즉 알록달록한 정도는 아래와 같이 0.0이 됩니다.
을 이용하면 주머니 안 구슬배합의 알록달록한 정도를 나타낼 수 있다는 것 감이 잡힐 것입니다. 왜냐하면, 반반씩 섞였을 때 엔트로피는 0.3, 한 가지 구슬만 있을 때는 0.0입니다. 따라서 알록달록할 수록 엔트로피가 커진 것입니다. 다른 비율의 조합들을 시도해 보면 좀 더 이해가 잘 될 겁니다.
주머니와 구슬 비유 안에서 엔트로피를 수학적으로 정의하겠습니다.
주머니 안에 들어있는 색깔별 구슬의 비율을 x_i라고 하면,
그 주머니의 엔트로피는 다음과 같습니다.
예를 들어, x_1은 빨간구슬의 비율, x_2는 흰 구슬의 비율 이렇게 말입니다.
이렇게 정의된 엔트로피는 주머니 안의 구슬 색깔들이 균일할 수록 값이 작습니다.
알록달록할 수록 값이 큽니다.
그래서 엔트로피의 정의는 "무질서도"입니다.
주머니 안에 여러 색깔의 구슬들이 섞여있을수록 무질서하다고 보면 됩니다.
엔트로피 개념에 대해서 직관적으로 이해했으니, decison tree로 다시 돌아가겠습니다.
Decison tree 설명을 위해서 주머니와 구슬 비유를 계속해서 사용하겠습니다.
구슬들이 섞여있는 상황에서 주머니 안에 작은주머니들을 만들고, 구슬들을 나눠서 다시 넣는 상상을 합시다.
아래 그림처럼 말입니다.
작은주머니가 2개 생겼고, 거기에 구슬들을 나눠 담았습니다.
이 때, 작은주머니들의 엔트로피를 구할 수 있을 것입니다.
왼쪽 작은주머니의 엔트로피는 0일 것이고, 오른쪽은 0.3 정도 될 것입니다.
엔트로피가 0이된 왼쪽 주머니는 그대로 두고,
오른쪽 작은주머니 안에 "작은작은주머니들"을 만들어서 구슬을 또 나눠 담을 수 있을 겁니다.
이러한 과정을 엔트로피가 0이 될 때까지 계속해서 반복하다 보면,
새로 만들어진 작은주머니들에는 같은 색깔의 구슬들만 담겨있을 겁니다.
즉, 엔트로피가 0이 된 것입니다
Decision tree의 동작 과정 중 중요한 것은
엔트로피 0를 만드는 것입니다.
즉, 구슬들을 작은주머니들에 나눠담아 가면서, 작은주머니들이 한 가지 색깔의 구슬만 담을 수 있도록 하는 것입니다.
Decision tree의 목적을 알면 왜 이런 과정이 필요한지 이해가 됩니다.
Decision tree는 일반적으로 분류를 하기 위한 방법입니다.
예를 들어서, 메일이 도착했는데 스팸 메일인지 아닌지를 구분한다든지,
제품이 불량인지 양품인지,
꽃의 특성을 보고 어떤 꽃인지 분류하는 일을 하는 것입니다.
여기서 엔트로피 개념이 필요한 이유는,
Decison tree는 분류 결과의 entropy = 0을 만들어 가는 분류 체계를 말합니다.
즉, 같은 것끼리 모아가는 과정을 말합니다.
엔트로피 개념과 decision tree의 기본 동작원리를 설명을 마쳤습니다.
이제는 decision tree를 아주 구체적인 예를 들어서 설명하겠습니다.
메일이 도착했을 때, 스팸 (spam) 메일인지, 아닌지를 구분하는 decision tree를 만들어보겠습니다.
참고로, 스팸메일이 아닌 정상 메일은 햄 (ham )메일이라고 합니다.
Decision tree를 만들기 위해서는 스팸과 햄 메일 관련한 학습데이터가 필요합니다.
학습데이터는 각 메일의 특징을 정리해 두어야 합니다.
여기서는 각 메일의 특징을 3개로 추렸다고 가정하겠습니다.
길이 : long, short, 메일의 길이를 나타내는 두 가지 타입
이미지포함여부 : yes, no 두 가지 타입으로 메일 내에 이미지가 들어 있는지
비트코인 단어 포함여부: yes, no 두가지 타입
아래와 같은 학습데이터를 모았다고 가정하겠습니다.
분류
속성: 길이
속성: 이미지 포함여부
속성: 비트코인 단어 포함여부
Spam
long
Y
Y
Spam
long
N
Y
Spam
long
N
Y
Spam
short
N
N
Spam
long
Y
Y
Ham
long
Y
N
Ham
long
Y
N
Ham
long
Y
N
Ham
short
Y
N
Ham
short
Y
Y
이러한 학습데이터가 주어졌을 때, decision tree는 속성을 기준으로 메일을 나눕니다.
예를 들어, 길이 속성을 기준으로 나눈다면 long과 short 기준에 따라서 메일들을 나눌 것이고,
이미지 포함 여부 속성이라면 Y 또는 N일 것입니다.
어떤 속성을 가지고 나눌지가 핵심인데,
가장 좋은 속성은 Spam과 Ham을 정확하게 구분해 주는 속성이 최고일 것입니다.
그 속성을 찾아내는 방법은,
사용할 수 있는 속성 1) 길이, 2) 이미지, 3) 비트코인에 대해서
각 속성의 값을 기준으로 학습데이터를 나눠보고, 그 분류 안에서 Spam과 Ham이 어느 정도 분리가 되었는지를 평가해서, 가장 분류가 잘 된 것을 기준으로 나누면 될 것입니다.
분류가 잘 되었다는 것은, "덜 알록달록", 즉, "Spam과 Ham"이 덜 섞인 것이므로 엔트로피와 관련이 높습니다.
그렇다면, 정리가 됩니다.
길이 속성값인 long과 short를 기준으로 분류하고, 그 분류된 것에 대해서 엔트로피 값을 구합니다.
마찬가지로 이미지와 비트코인 속성을 기준으로도 엔트로피 값을 구합니다.
그렇게 구해진 엔트로피 값 중에서 최소값을 가지는 속성을 기준으로 일단 메일을 분류하면 되겠습니다.
길이 속성값 long과 short를 기준으로 메일을 분류해 보면 그 결과는 다음과 같습니다.
속성 길이
Spam 비율
Ham 비율
엔트로피
long
4/7
3/7
0.2965
short
1/3
2/3
0.2764
따라서 길이 속성에 따른 엔트로피는 0.2965 + 0.2764가 됩니다.
꽤 높기 때문에 길이는 Spam과 Ham 구분에 별로 도움이 안되는 것을 알 수 있습니다.
이미지 속성값 Y과 N을 기준으로 메일을 분류해 보면 그 결과는 다음과 같습니다.
속성 이미지
Spam 비율
Ham 비율
엔트로피
Y
2/7
5/7
0.2598
N
3/3
0/3
0
이미지 속성에 따른 엔트로피는 0.2598이 됩니다.
비트코인 속성값 Y과 N을 기준으로 메일을 분류해 보면 그 결과는 다음과 같습니다.
속성 이미지
Spam 비율
Ham 비율
엔트로피
Y
4/5
1/5
0.217
N
1/5
4/5
0.217
비트코인에 따른 엔트로피는 0.217 + 0.217입니다.
따라서 이미지 속성에 따른 엔트로피가 가장 낮기 때문에
이미지 속성으로 일단 구분하면 좋을 것 같습니다.
직관적으로 보아도, 이미지가 없는 메일들은 일단 spam 메일로 분류가 됩니다. (물론 현실상황은 그렇지 않지만, 예제를 위해서 그냥 넘어가도록 하겠습니다.)
이렇게 해서 1차적으로 구성된 decision tree는 아래와 같은 모양이 됩니다.
이미지=No인 경우는 모두 spam으로 분류되고,
이미지=Yes인 경우는 ham과 spam이 각각 5개, 2개로 섞여 있게 됩니다.
그러면 다음 단계는, 위 그림에서 왼편 7개 메일에 대해서 entropy를 가장 작게 하는 분류 기준을 찾아내면 됩니다.
물론, 이미지 유무 기준은 더이상 사용할 수 없을 겁니다.
아래 표는 7개 이미지에 대한 데이터만 따로 뽑아 놓은 것입니다.
분류
속성: 길이
속성: 이미지 포함여부
속성: 비트코인 단어 포함여부
Spam
long
Y
Y
Spam
long
Y
Y
Ham
long
Y
N
Ham
long
Y
N
Ham
long
Y
N
Ham
short
Y
N
Ham
short
Y
Y
위의 데이터에 대해서, '길이' 속성과 '비트코인 유무' 속성에 대해서 각각 엔트로피를 계산해 보겠습니다.
_state_dict는 Python dictionary type으로, keyd와 value 쌍으로 이루어져 있습니다.
2단계
Dictionary에 읽혀진 파라미터들의 이름을 바꾸어야 할 때가 있습니다.
아래 설명한 경우가 아니라면, 2단계는 건너뛰어도 됩니다.
예를 들어, 모델 학습할 때, nn.DataParallel( )을 사용했다면 파라미터 앞에 'module.' 이라는 prefix가 붙습니다.
이 파라미터들은 모델로 로딩이 불가하기 때문에 이름에서 'module.' prefix를 제거해 줘야 합니다.
바뀐 이름으로 파라미터를 저장해야 하기 때문에 새로운 dictionary에 저장해 주는 것이 좋습니다.
새로운 dictionary로는 OrderedDict 를 사용합니다.
OrderedDict는 dictionary와 같지만, 저장되는 (key, value)들의 순서도 같이 저장합니다. 순차 저장하고, 그 순서대로 (key, value)를 뽑아낼 수 있다는 겁니다.
이게 왜 필요하나면, 모델 로딩할 때, 각 파라미터들의 값을 순차적으로 채워나가기 때문입니다.
일반 dictionary를 사용하면, 순서가 바뀔 수 있어서 모델 로딩할 때 문제가 생길 수 있습니다.
아래 코드는 저장된 파라미터 이름에서 'module.'을 제외한 새 이름으로 파라미터를 신규 OrderedDict에 저장하는 예입니다.
from collections import OrderedDict
new_state_dict = OrderedDict()
for k, v in _state_dict.items():
new_state_dict[k[7:]] = v
위 코드에서 k[7:]은 이름에서 'module.' 문자열을 제거한 이후라는 뜻입니다.
이제 new_state_dict에는 원래 이름들로 저장된 모델 파라미터들이 있습니다.
3단계
new_state_dict를 실제 모델에 로딩하는 과정입니다.
모델을 생성한 후, 모델의 load_state_dict() 함수를 이용해서 로딩하면 됩니다.
# new_state_dict : 파일에서 읽어들인 모델 파라미터들이 OrderedDict에 저장
model = resnet50()
model.load_state_dict(new_state_dict, strict=False)
위 코드에서는 ResNet50 모델을 생성하고, 그 모델에 파라미터들을 로딩합니다.
load_state_dict( ) 함수의 argument로 strict=False를 지정한 것을 주의깊게 보세요.
모델의 모든 파라미터들과 new_state_dict에 있는 파라미터들이 이름과 개수가 모두 동일하다면, 로딩이 성공합니다.
그러나, 이름과 개수가 틀릴 경우, exception이 발생하게 됩니다. 예를 들어, Missing key 같은 겁니다. 모델에 파라미터 A가 있는데, 로딩하려는 new_state_dict에는 없다라는 겁니다.
그런데, 이런 exception이 에러 상황이 아니라도 발생할 때가 있습니다. 예를 들어, 저장된 모델이 일부 파라미터들만 저장한 경우도 있거든요. 이럴 때, 에러가 아니라고 알려주는 것이 strict=False 입니다.
주의할 점도 있습니다. strict=False로 설정하면, 모델은 매칭되는 파라미터들만 로딩하고, 나머지는 버려두게 됩니다. 그래서 최악의 경우, 매칭되는 파라미터들이 없다면, 모델은 어떤 파라미터도 로딩하지 않게 됩니다. 에러도 발생시키지 않으면서 말이죠.
4단계
모델 파라미터에 값들이 제대로 로딩되었는지 확인하는 방법입니다.
model = resnet50(num_classes=2)
print('before--->\n', model.state_dict()['layer4.2.conv3.weight'])
model.load_state_dict(new_state_dict, strict=False)
print('after--->\n', model.state_dict()['layer4.2.conv3.weight'])
로딩 전 후에 같은 위치의 파라미터 값을 출력해 보면 됩니다.
만약, 로딩이 제대로 되지 않았다면 파라미터 값이 변하지 않았을 겁니다.
위 코드 예에서는 layer4.2.conv3.weight 파라미터 값을 확인해 봤습니다.
파라미터 이름들을 알아내는 코드는 아래와 같습니다.
for name, param in model.named_parameters():
if param.requires_grad is True:
print(name)
named_parameters()를 이용해서 파라미터들의 이름과 파라미터 값을 추출하고, 출력하면 됩니다.
5단계
파라미터값들이 로딩된 모델을 이용해서 추가 학습을 할 때가 있습니다.
모델 전체를 하는 것이 아니라, 모델의 일부분만 하고 싶을 때가 있습니다.
이 경우는, 학습을 진행할 파라미터들과 그렇지 않을 파라미터를 찾아서 아래 코드와 같이 지정해 주면 됩니다.
for name, param in model.named_parameters():
if contains_keyword(name, omit_keywords) is True:
param.requires_grad = True
else:
param.requires_grad = False
학습 진행 여부는 requires_grad 값을 True 혹은 False로 지정하여 결정하는데,