본 포스팅은 10x 체험단 활동의 일환으로 강의 수강권을 제공받아 작성한 후기입니다. 기획한 화면을 실제 서비스로 완성하고 배포해본 바이브 코딩 학습 아이디어에서 실제 작동하는 서비스까지 이번 코드잇 텐엑스 3주차 과정에서는 지난 1~2주차 동안 기획하고 화면으로 구체화했던 서비스를 실제로 작동하는 웹서비스로 발전시키는 과정을 학습했다. 1주차에는 사용자의 불편함을 발견하고 이를 서비스 아이디어로 발전시키면서 MVP와 PRD를 작성했고, 2주차에는 Google Stitch를 활용해 기획한 내용을 실제 UI 화면으로 만들어보았다. 그리고 이번 3주차에서는 그 화면을 Google AI Studio로 가져와 기능을 구현하고, Firebase를 활용해 데이터를 저장하며, GitHub와 Vercel을 연결해 실제 인터넷에서 사용할 수 있는 서비스로 배포하는 과정까지 경험했다. 이전까지는 서비스 기획과 개발, 배포가 각각 별개의 과정처럼 느껴졌는데, 이번 학습을 통해 하나의 서비스가 만들어지는 전체 흐름을 직접 경험할 수 있었다. 📍 Google Stitch에서 만든 화면을 실제 서비스로 발전시키기 3주차에서 가장 먼저 배운 것은 화면이 있다고 해서 서비스가 완성되는 것은 아니라는 점 이었다. 2주차까지 Google Stitch를 활용해 ClipSort의 화면을 구성했지만, 당시에는 화면의 형태만 존재할 뿐 실제로 데이터를 저장하거나 사용자의 행동에 따라 기능이 동작하는 상태는 아니었다. 이번에는 Google Stitch에서 만든 결과물을 Google AI Studio로 옮겨 실제 기능을 추가했다. 내가 기획한 ClipSort는 유튜브, 인스타그램, 틱톡 등에서 나중에 다시 보고 싶은 콘텐츠를 저장한 뒤 원하는 콘텐츠를 쉽게 다시 찾을 수 있도록 도와주는 서비스다. 사용자가 콘텐츠 링크를 입력하면 이를 저장하고, 카테고리에 따라 콘텐츠를 확인하거나 수정·삭제할 수 있도록 기능을 구성했다. 이 과정에서 AI에게 단순히 “이 기능을 만들어줘”라고 요청하는 것이 아니라, 어떤 버튼을 눌렀을 때 어떤 동작이 발생해야 하는지 구체적으로 설명해야 원하는 결과에 가까워진다는 것을 다시 한번 느꼈다. 특히 AI가 처음 만들어준 화면이나 기능이 항상 내가 의도한 방향과 정확히 일치하지는 않았다. 따라서 결과물을 직접 확인하고, 수정이 필요한 부분을 다시 설명하면서 여러 번 다듬는 과정이 필요했다. 바이브 코딩은 AI에게 모든 것을 맡기는 것이 아니라 내가 원하는 결과를 명확히 정의 하고, AI가 만든 결과를 판단하고 수정하는 과정 이라는 점을 더 확실하게 이해하게 됐다. 📍 Firebase를 활용해 데이터 저장하기 이번 주차에서 새롭게 경험한 부분 중 하나는 데이터베이스였다. 이전에는 화면에 콘텐츠가 추가되더라도 단순히 화면 안에서만 보이는 것이라고 생각했지만, 실제 서비스에서는 사용자가 저장한 데이터를 계속 유지하기 위한 공간이 필요하다는 것을 배웠다. 이를 위해 Firebase Firestore를 ClipSort와 연결했다. 사용자가 콘텐츠를 저장하면 Firebase에 데이터가 저장되고, 카테고리를 변경하거나 콘텐츠의 상태를 수정하면 데이터베이스에 저장된 값도 함께 변경되도록 구성했다. 이 과정을 통해 프론트엔드와 백엔드, 데이터베이스가 각각 어떤 역할을 하는지 조금 더 구체적으로 이해할 수 있었다. 사용자가 직접 보는 화면이 프론트엔드 라면, 화면에서 발생한 요청을 처리하고 데이터를 주고받는 과정이 백엔드 와 연결되며, 실제 정보가 유지되는 공간이 데이터베이스 라는 흐름을 실제 프로젝트를 통해 경험할 수 있었다. 처음에는 데이터베이스라는 용어 자체가 어렵게 느껴졌지만, 내가 만든 서비스 안에서 데이터가 생성되고 변경되는 모습을 직접 확인하니 훨씬 쉽게 이해할 수 있었다. 📍 GitHub와 Vercel을 활용해 직접 배포해보기 기능을 구현한 다음에는 내가 만든 서비스를 다른 사람도 인터넷에서 사용할 수 있도록 배포하는 과정을 진행했다. Google AI Studio에서 작업한 코드를 GitHub로 내보내고, GitHub 저장소를 Vercel과 연결했다. 이 과정에서 새롭게 알게 된 점은 GitHub에 새로운 변경사항을 Push하면 Vercel이 이를 감지해 자동으로 새로운 버전을 배포할 수 있다는 것이었다. 즉, Google AI Studio에서 기능 수정 → GitHub에 Push → Vercel 자동 배포 라는 하나의 흐름을 만들 수 있었다. 처음 배포를 시도했을 때는 바로 성공하지 않았다. Vercel에서 npm install 단계에서 오류가 발생했지만 로그에는 자세한 원인이 나타나지 않아 처음에는 무엇을 수정해야 할지 막막했다. 그래서 프로젝트를 내 컴퓨터로 내려받고 Node.js를 설치한 뒤 직접 npm install 을 실행해 오류를 확인했다. 그 결과 Vite와 esbuild의 버전이 서로 맞지 않아 dependency 충돌이 발생하고 있다는 것을 확인할 수 있었다. package.json 에서 관련 버전을 수정한 후 다시 npm install 을 실행했고, 이어서 npm run build 까지 정상적으로 완료되는 것을 확인했다. 수정한 내용을 다시 GitHub에 Push하자 Vercel에서 새로운 배포가 진행됐고, 최종적으로 Status가 Ready 상태로 변경되며 배포에 성공했다. 처음에는 에러가 발생하면 단순히 “배포가 안 된다”라고만 생각했지만, 이번 경험을 통해 오류 메시지를 확인하고 문제의 위치를 좁혀가며 해결하는 과정도 개발에서 매우 중요한 부분이라는 것을 알게 됐다. 📍 이번 학습을 통해 달라진 점 처음 프로젝트를 시작했을 때는 내가 서비스 아이디어를 직접 웹사이트로 만들어 인터넷에 배포하는 것까지 가능할 것이라고 생각하지 못했다. 하지만 3주 동안 학습하면서 하나의 아이디어가 점차 서비스의 형태로 발전하는 과정을 직접 경험했다. 처음에는 사용자의 불편함 발견 → 서비스 아이디어 정도에 머물렀다면, 지금은 문제 정의 → MVP → PRD → UI 설계 → 기능 구현 → 데이터 저장 → GitHub 관리 → 서비스 배포 까지 하나의 과정으로 바라볼 수 있게 됐다. 특히 이번 프로젝트를 통해 코드를 직접 처음부터 작성하지 않더라도 AI 도구를 활용해 서비스를 만들어볼 수 있다는 점이 인상적이었다. 하지만 동시에 AI가 모든 것을 자동으로 해결해주는 것은 아니었다. 내가 원하는 기능이 무엇인지 명확하게 설명해야 했고, AI가 만들어준 결과가 제대로 동작하는지 직접 확인해야 했다. 오류가 발생했을 때는 원인을 찾아 수정하는 과정도 필요했다. 결국 바이브 코딩에서도 중요한 것은 단순히 AI에게 요청하는 것이 아니라 문제를 정의 하고, 요구사항을 구체화 하며, 결과물을 검증하는 능력 이라는 생각이 들었다. 📍 기획자로서 새롭게 느낀 점 이번 학습은 내가 관심을 가지고 있는 서비스 기획 및 AI 서비스 개발과도 많이 연결되어 있었다. 이전에는 기획자가 요구사항을 정리해 개발자에게 전달하는 역할이라고 생각했다면, 이번에는 직접 화면을 구성하고 기능을 구현해보면서 웹서비스 만들기 개발 과정에서 어떤 부분을 명확하게 정의해야 하는지 조금 더 이해할 수 있었다. 예를 들어 “카테고리를 수정할 수 있게 해주세요” 라는 요구사항과 “콘텐츠 카드의 카테고리 변경 버튼을 누르면 카테고리를 선택할 수 있고, 변경 후에는 화면과 데이터베이스에 동시에 반영되어야 한다” 라는 요구사항은 개발 과정에서 전달되는 정보의 수준이 완전히 다르다는 것을 체감했다. 앞으로 서비스 기획을 할 때도 단순히 필요한 기능을 나열하는 것이 아니라 사용자가 어떤 행동을 하고, 시스템이 어떻게 반응해야 하는지까지 구체적으로 설계하는 습관을 만들고 싶다. 📍 앞으로의 목표 이번 3주차까지의 학습을 통해 ClipSort의 기획부터 UI 제작, 기능 구현, 데이터 저장, 배포까지 한 번의 사이클을 경험했다. 앞으로는 단순히 서비스를 만들어보는 것에서 끝나는 것이 아니라 실제 사용자의 반응을 확인하고 서비스를 개선하는 과정까지 경험해보고 싶다. 특히 현재 만든 ClipSort에 로그인 기능이나 사용자별 데이터 관리, 검색 기능 등을 추가하고, 실제 사용자가 서비스를 이용하면서 어떤 기능을 많이 사용하는지 확인해보고 싶다. 이번 프로젝트를 통해 가장 크게 얻은 것은 개발 지식 자체보다도 아이디어를 실제 결과물로 만들어볼 수 있는 방법을 알게 되었다는 점이다. 앞으로도 새로운 서비스 아이디어가 생겼을 때 기획서에서 끝내지 않고, AI를 활용해 빠르게 프로토타입을 만들고 직접 테스트하면서 아이디어를 검증해보는 경험을 계속 쌓아가고 싶다.
Call~Girls In Malviya Nagar ☎ 9643097474 Call Girls in Saket ¶¶Service, escorts Service in Home & Hotel in Delhi NCR 24 Hours Available Service Call Girls, Contact Aadi, +91-9643097474 (Any Time. Any Where) Call Girls in Delhi Charges, Shot 1500 Night 6000Call Girls In Delhi South Delhi Female Escort In Delhi Model College Girls In Delhi South Delhi Escorts Service Hauz Khas, Saket, Malviya Nagar, Lajpat Nagar, Munirka, Vasant Kunj, Vasant Vihar, Model Town, Nehru Place, Green Park, Safdarjung, Rk Puram, Khanpur, Rajiv Chowk, Greater Kailash, Kailash Colony, All,Model Escort Agency South Delhi WhatsApp +91- 9643097474 Delhi NCR Call Girls Contact Pooja, +91-9643097474 Call Girls in Delhi NCR in Delhi NCR Escorts in Delhi-NCR Escort Service In Delhi High Class Escort And Call Girls In Delhi Call Contact Aadi BHai, +91-9643097474 in Call South Delhi Malviya Nagar Delhi ,+91-9643097474 // We Provide You Hi Class Independent Call Girls Available In Connaught Place With Five Star Hotels. You Can Reach At Our Place in Delhi our place Which is very Clean Hygienic & 100% safe Accommodation.Get in touch with Me ((Pooja 9643097474-))”Get On the Line by Buzz Phone Call”((Aadi Bhai +91-9643097474 Available 24*7hr Top Grade Service/100% Cooperative All round Service.On the off chance that You Are Looking For Someone Who Can Give You Company In Weekend Of This Rainy Season Then You Can Choose Our Beautiful Connaught Place Central Delhi Escorts As Your Companion. These Girls Choose Escorts Profession Because They Want To Provide Some Relief That An Alone Person Face In Their Life.Sterile Full AC Neat and Clean Rooms Avail
라우트마다 OPTIONS 핸들러가 있다. cors.ts 가 * 를 쓰지 않고 origin별로 allowlist를 검사하는 이유는 뭐고, OPTIONS 핸들러가 없으면 실제 요청은 어덯게 실패하는지. Access-Control-Allow-Origin 에는 값을 하나만 넣을 수 있다. https://domain.co.kr, https://www.domain.co.kr 처럼 여러 개를 나열하는 문법이 없음. 허용할 출처가 여러 개라면 서버가 요청의 Origin 헤더를 읽고, allowlist에 있을 때 그 값을 그대로 돌려줘야한다. 운영 도메인, www 도메인, Framer 미리보기, localhost:3000 이 모두 필요하다면 getCorsHeaders(origin) 처럼 origin을 인자로 받는 함수가 필요하다. * 는 credentials와 같이 쓸 수 없다. fetch(..., { credentials: 'include' }) 로 쿠키를 보내는 요청에서 응답이 Allow-Origin: * 이면 브라우저가 응답을 거부한다.쿠키기반 인증이 지금 없더라도, 나중에 추가하는 순간 * 로는 동작하지 않는다.
그냥 울겠어요 너무 어려워요 전 그냥 감자에요 엉엉 오늘은 그냥 뭐 했는지도 모르겠어요 과제 그냥 찔끔 찔끔 하려고 인강 마저 듣고 과제 쪼금 했는데 1-4에서 막혀버림 왜 fillna(df["Temperature"].mean) 했는데 안바뀌니;;;;; 그냥 죽고 싶네요 이건 다음주 튜터님한테 물어봐야징 에혀 언젠가는 똑똑해지는게 맞겠지요 일단 오늘은 이것만 적을래요,, 힘들어,, 연휴 푹 쉬고 담주는 진짜 달리겠음 진짜임 진짜
Efficient testing is essential for electronics companies and research laboratories working under demanding development schedules. Engineers often need to test prototypes repeatedly, identify design issues quickly, and collect reliable measurement data. The right combination of instruments can make these tasks easier while reducing unnecessary manual work. Before purchasing equipment, an R&D team should understand its testing workflow. Working with a knowledgeable Test Equipment Supplier in Bengaluru can help engineers identify instruments that match their measurement requirements. Instead of selecting equipment based only on price, teams should consider performance, usability, connectivity, calibration, and long-term application needs. Oscilloscopes are commonly used for debugging electronic circuits because they allow engineers to observe changing signals. They can help identify timing problems, voltage fluctuations, noise, overshoot, ringing, and other waveform abnormalities. Depending on the application, engineers may need different bandwidths, sampling rates, memory depths, and channel configurations. Other R&D Lab Test Equipment can be combined with oscilloscopes to create a complete measurement setup. Digital multimeters can be used for accurate voltage, current, and resistance measurements. Signal generators can provide controlled test signals, while programmable DC power supplies can provide stable power to prototypes. Electronic loads can be used to evaluate how power supplies, batteries, and converters respond to different load conditions. Automation can provide another major improvement in testing efficiency. Modern Test Equipment in Bengaluru can often communicate with computers through USB, Ethernet, LAN, or GPIB interfaces. Engineers can use these connections to control instruments, collect measurements, store test results, and execute repetitive test sequences automatically. Automated data collection can reduce the amount of manual recording required during testing. It can also improve consistency because the same test procedure can be repeated using predefined settings. This is particularly useful when an R&D team needs to compare multiple prototypes or evaluate performance under several operating conditions. Proper organization of test equipment can also improve efficiency. Instruments should be arranged so that commonly used controls and connections are easily accessible. Suitable probes, cables, adapters, and fixtures should be available when required. Clear labeling and organized connections can reduce setup time and prevent connection mistakes. Calibration should remain part of the testing workflow. Instruments that are not properly maintained may produce unreliable results, which can lead engineers to spend time investigating problems that are actually caused by the measurement system. Following appropriate calibration and maintenance schedules helps maintain confidence in test results. Technical support is another useful consideration when selecting equipment. Engineers may need assistance with configuration, software integration, troubleshooting, or instrument features. A capable Test Equipment Supplier in Bengaluru can provide guidance that helps teams use their equipment more effectively. Ultimately, efficient testing depends on more than having advanced instruments. The equipment must match the application, work well together, and support the laboratory's workflow. By planning equipment purchases around actual testing requirements, Bengaluru R&D teams can improve measurement efficiency and make prototype development more systematic. A well-designed testing environment allows engineers to spend less time dealing with measurement limitations and more time improving their products. Proper equipment selection, automation, calibration, and technical support can therefore contribute significantly to productive electronics R&D.
📅 Date : 2026.10.04 🏷️ Tags : #Python #AI #MachineLearning #Multimodal #LLaVA #LatentDiffusion #ImageBind 🎯 이번 주 목표 이번 기술블로그에서는 정규세션 내용을 복습하고, 과제를 다시 분석하며, 관련 논문 리뷰 링크를 정리하여 학습을 확장하는 것을 목표로 한다. 📌 Contents 1. 세션 복습 2. 과제 복습 3. 관련 논문 리뷰 링크 4. 이번 주 한 줄 정리 1️⃣ 세션 복습 ✨ 핵심 개념 및 내용 정리 이번 세션에서 가장 중요하다고 생각한 개념을 자신의 언어로 정리해봅시다. 📖 핵심 개념 붙이기 (LLaVA) : 고정된 CLIP vision encoder 출력에 projection 하나만 달아서 LLM 입력 공간으로 옮기고, 이렇게 만든 이미지 토큰을 텍스트 토큰 옆에 이어붙인다. 추론 (Multimodal-CoT) : rationale 생성과 answer 추론을 두 단계로 나누고 두 단계 모두에 vision feature를 넣어서, 작은 모델이 이미지와 맞지 않는 근거를 지어내는 문제를 줄인다. 생성 (Latent Diffusion) : autoencoder로 이미지를 latent로 압축한 다음 그 안에서 diffusion을 돌린다. 텍스트 조건은 매 denoising step마다 cross-attention으로 들어간다. 전이 (ImageBind) : 이미지를 허브로 두고 (이미지, X) 쌍만 대조학습했는데, 한 번도 같이 학습한 적 없는 (오디오, 텍스트) 같은 쌍까지 정렬된다. 📝 내용 정리 지난주 선택 과제였던 Mind the Gap에서 CLIP으로 학습해도 이미지 임베딩과 텍스트 임베딩이 같은 공간 안의 서로 다른 원뿔(cone)에 모여 있다는 걸 봤다. 같은 벡터 공간에 올라가 있어도 두 모달이 완전히 겹치지는 않는다. 이번 주는 그다음 이야기였다. 정렬한 뒤에 함께 추론하고, 생성하고, 더 많은 모달로 넓히는 과정을 논문 네 편으로 따라갔다. 축 논문 핵심 장치 지난주에 배운 부품 Architecture LLaVA projection W 하나 CLIP vision encoder Reasoning Multimodal-CoT 2단계 구조 + gated fusion cross-attention, gated fusion Generation Latent Diffusion latent 공간 + cross-attention 조건 cross-attention Transference ImageBind 이미지 허브 + InfoNCE CLIP, 대조학습 1 LLaVA : LLM에 눈을 다는 가장 단순한 방법 출처: Liu et al., Visual Instruction Tuning (arXiv:2304.08485), Figure 1 CLIP, ViLT, LXMERT 같은 기존 모델은 VQA용, 검색용, 캡셔닝용이 따로 있었고 자유로운 대화나 여러 단계 추론은 하지 못했다. 그렇다고 LLM에 이미지까지 넣어 처음부터 다시 학습하기엔 비용이 너무 크다. 그래서 나온 발상이 이미 잘 학습된 CLIP과 LLM은 그대로 두고 둘을 잇는 부분만 학습하자는 것이었다. 연결 방식은 지난주에 이미 두 가지를 봤다. Flamingo는 고정된 LLM 레이어 사이에 gated cross-attention을 끼워 넣었고, BLIP-2는 Q-Former의 learnable query가 이미지에서 필요한 정보만 압축해서 넘겼다. LLaVA는 여기서 한 단계 더 단순해진다. $$ Z_v = g(X_v), \quad H_v = W \cdot Z_v $$ $g$는 고정된 CLIP ViT-L/14이고 $W$는 학습 가능한 선형 층이다. $Z_v$는 LLM이 아직 못 알아듣는 "비전 언어"이고, $W$를 통과한 $H_v$는 LLM이 단어처럼 다룰 수 있는 이미지 토큰이 된다. 텍스트는 Vicuna 자체의 임베딩 층을 거쳐 $H_q$가 되고, 두 토큰열을 이어붙인 하나의 시퀀스를 LLM이 읽어서 답 $X_a$를 생성한다. 학습 목표는 일반 언어모델과 같은 autoregressive likelihood다. $$ p(X_a \mid X_v, X_{\mathrm{instruct}}) = \prod_{i=1}^{L} p_\theta(x_i \mid X_v, X_{\mathrm{instruct}, \lt i}, X_{a, \lt i}) $$ $W$가 이미지 쪽에만 붙는 이유는 LLM 입장에서 텍스트는 이미 모국어이고 이미지는 외국어이기 때문이다. 번역이 필요한 쪽에만 번역기를 단 셈이다. 공식 코드(llava_arch.py)를 보면 초기 버전은 nn.Linear 하나였고, LLaVA-1.5부터는 Linear → GELU → Linear의 2층 MLP로 바뀌었다. 논문 보고 수치는 합성 멀티모달 instruction 데이터에서 GPT-4 대비 상대 점수 85.1%, ScienceQA fine-tune 시 92.53%(당시 SOTA)였다. 강한 사전학습 encoder와 LLM이 이미 좋은 표현을 갖고 있으니 필요한 건 둘을 잇는 정렬과 instruction 데이터 정도였다는 게 이 논문의 메시지로 읽혔다. 구조가 단순해서 확장하고 재현하기 쉬웠고, 이후 많은 MLLM이 이 형태를 따른다. 2 Multimodal-CoT : 근거를 만들 때도 이미지를 보게 하기 출처: Zhang et al., Multimodal Chain-of-Thought Reasoning in Language Models (arXiv:2302.00923), 공식 레포 그림 언어 모델에서는 "차근차근 생각해보자" 식의 CoT가 잘 통한다. 그런데 이미지가 낀 문제에 1B 미만 모델로 CoT를 그대로 적용하면 이미지를 반영하지 못한 근거(hallucinated rationale)가 나온다. 수업에서 본 자석 예시에서 vision 없이 학습한 baseline은 "한 자석의 S극이 다른 자석의 S극과 가장 가깝다"는 근거를 만들어 repel(B)로 틀렸고, vision feature를 넣자 "N극이 S극과 가장 가깝다"로 바로잡혀 attract(A)를 맞혔다. 잘못된 근거가 오답을 끌고 가는 구조다. 그래서 근거 생성과 정답 추론을 두 단계로 나눈다. $$ R = F(X), \quad X = \lbrace X^{1} {\mathrm{language}}, X {\mathrm{vision}} \rbrace $$ $$ A = F(X'), \quad X^{2} {\mathrm{language}} = X^{1} {\mathrm{language}} \circ R $$ 1단계에서 질문, 선택지, 이미지로 근거 $R$을 만들고, 2단계에서는 원래 질문 뒤에 $R$을 이어붙인 입력과 이미지로 답 $A$를 낸다. 두 단계 모두에 이미지가 들어간다는 점이 중요하다. 모델 안에서 두 모달을 섞는 과정은 encoding, interaction, gated fusion, decoding 네 단계다. $$ H_{\mathrm{language}} = \mathrm{LanguageEncoder}(X_{\mathrm{language}}) $$ $$ H_{\mathrm{vision}} = W_h \cdot \mathrm{VisionExtractor}(X_{\mathrm{vision}}) $$ $$ H^{\mathrm{attn}} {\mathrm{vision}} = \mathrm{Softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V, \quad Q = H {\mathrm{language}}, \quad K = V = H_{\mathrm{vision}} $$ $$ \lambda = \mathrm{Sigmoid}(W_l H_{\mathrm{language}} + W_v H^{\mathrm{attn}}_{\mathrm{vision}}) $$ $$ H_{\mathrm{fuse}} = (1 - \lambda) \cdot H_{\mathrm{language}} + \lambda \cdot H^{\mathrm{attn}}_{\mathrm{vision}} $$ $W_h$로 ViT feature의 차원을 텍스트에 맞추는 부분은 LLaVA의 $W$와 같은 역할이다. cross-attention에서는 텍스트 토큰이 query가 되어 이미지 패치를 훑고, 관련 있는 패치에서 정보를 더 많이 가져온다. 게이트 $\lambda$가 0에 가까우면 텍스트만 쓰는 baseline과 같아지고 1에 가까우면 시각 정보 위주가 되니, 토큰마다 이미지를 얼마나 반영할지 모델이 스스로 정하는 장치로 이해했다. 마지막으로 $H_{\mathrm{fuse}}$가 Transformer decoder로 들어가 근거나 정답을 생성한다. 결과적으로 1B 미만 모델이 ScienceQA에서 91.68%를 기록해 당시 GPT-3.5(75.17%)를 약 16%p 앞섰고, hallucination이 줄고 수렴도 빨라졌다. 모델을 키우는 대신 추론 과정에 구조를 줘서 작은 모델로도 강한 추론을 끌어낸 사례다. 관련 연구로 MLLM의 물체 hallucination을 Yes/No로 재는 POPE, 추론에 필요한 이미지 영역을 스스로 찾아 집중하는 Visual CoT, 이미지를 crop·zoom하는 조작 자체를 추론에 넣는 thinking with images 흐름도 소개됐다. 3 Latent Diffusion : 줄여서 그리고, 다시 키운다 Diffusion은 학습할 때 이미지에 노이즈를 조금씩 더하고 그 노이즈를 한 스텝씩 지우는 법을 배우며, 생성할 때는 순수 노이즈에서 시작해 반복적으로 지워 나간다. $$ L_{DM} = \mathbb{E}_{x, \epsilon \sim \mathcal{N}(0,1), t}\left[ \lVert \epsilon - \epsilon_\theta(x_t, t) \rVert_2^2 \right] $$ 노이즈 낀 이미지 $x_t$와 단계 $t$를 받아 그때 더해진 노이즈 $\epsilon$을 맞히도록 학습한다. 노이즈를 알면 지울 수 있다. 이 식이 어디서 나오는지는 아래 심화 파트에서 DDPM 논문을 따라 유도했다. 문제는 픽셀 공간에서 바로 diffusion을 하면 계산량이 너무 크다는 것이다. 수업 자료 기준으로 당시 선도 모델이 150~1000 V100 GPU-day를 썼다. LDM은 압축과 생성을 명시적으로 분리해서 이 문제를 푼다. 출처: Rombach et al., High-Resolution Image Synthesis with Latent Diffusion Models (arXiv:2112.10752), Figure 3 Perceptual compression : 따로 사전학습한 autoencoder의 encoder $\mathcal{E}$가 이미지 $x$를 latent $z$로 줄인다. 사람 눈에 잘 안 띄는 고주파 디테일을 여기서 걷어낸다. 생성 : latent 공간에서 denoising U-Net $\epsilon_\theta$가 노이즈를 반복해서 지워 깨끗한 $z$를 만든다. diffusion은 여기서만 일어나고, 이미지의 의미와 구성을 배우는 데 집중한다. 복원 : 생성이 끝난 $z$를 decoder $\mathcal{D}$가 다시 이미지 $\tilde{x}$로 되돌린다. 손실도 $x$ 자리에 latent가 들어가고 조건 하나가 추가될 뿐 형태는 같다. $$ L_{LDM} = \mathbb{E}_{\mathcal{E}(x), y, \epsilon \sim \mathcal{N}(0,1), t}\left[ \lVert \epsilon - \epsilon_\theta(z_t, t, \tau_\theta(y)) \rVert_2^2 \right] $$ "고양이 그림" 같은 텍스트 조건 $y$는 U-Net이 그대로 읽을 수 없으니 도메인 encoder $\tau_\theta$(텍스트면 Transformer)가 먼저 벡터로 바꾸고, 그 결과를 U-Net 중간층에 cross-attention으로 넣는다. $$ Q = W_Q^{(i)} \cdot \varphi_i(z_t), \quad K = W_K^{(i)} \cdot \tau_\theta(y), \quad V = W_V^{(i)} \cdot \tau_\theta(y) $$ $$ \mathrm{Attention}(Q, K, V) = \mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d}}\right) \cdot V $$ 여기서 query는 이미지 쪽(U-Net의 중간 표현 $\varphi_i(z_t)$)이고 key와 value가 텍스트 쪽이다. 길이가 다른 두 시퀀스(이미지 위치 N개, 단어 M개)를 자연스럽게 연결할 수 있다는 게 cross-attention을 쓰는 이유다. 조건을 처음 한 번만 주지 않고 매 denoising step마다 참조하는 이유도 수업에서 짚었다. 생성이 여러 스텝에 걸쳐 진행되기 때문에 조건을 처음에만 주면 뒤쪽 스텝이 조건에서 벗어날 수 있다. $\tau_\theta$만 바꿔 끼우면 semantic map, 저해상도 이미지, 클래스 라벨 같은 다른 조건도 같은 U-Net 구조로 받을 수 있다. 수업에서 cross-attention을 "멀티모달 생성 모델의 조종간"이라고 부른 게 이 지점이다. 이해 모델(LLaVA)과 생성 모델(LDM)을 하나로 합치는 흐름으로는 이미지와 텍스트를 모두 토큰으로 바꿔 하나의 Transformer로 처리하는 Chameleon도 소개됐다. 4 ImageBind : 이미지를 허브로 여섯 모달 묶기 출처: Girdhar et al., ImageBind: One Embedding Space To Bind Them All (arXiv:2305.05665), Figure 1 CLIP은 이미지와 텍스트 두 모달을 대조학습으로 정렬했다. 오디오, 깊이(depth), 열화상(thermal), IMU까지 여섯 모달을 정렬하려면 모든 쌍(15개)의 데이터가 필요할 것 같지만, ImageBind는 각 모달을 이미지와만 짝지어 학습한다. 동영상에는 소리와 화면이, 1인칭 영상에는 IMU와 화면이 원래 같이 있으니 따로 라벨링하지 않아도 쌍 데이터를 모을 수 있다. 손실은 각 (이미지, 모달 M) 쌍에 대한 InfoNCE다. $q_i$는 이미지 임베딩, $k_i$는 같은 쌍의 다른 모달 임베딩이다. $$ L_{\mathcal{I}, \mathcal{M}} = -\log \frac{\exp(q_i^{\top} k_i / \tau)}{\exp(q_i^{\top} k_i / \tau) + \sum_{j \ne i} \exp(q_i^{\top} k_j / \tau)} $$ positive 쌍은 가깝게, 배치 안의 나머지는 멀게 만든다. 실제로는 방향을 바꾼 손실까지 더해서 양방향으로 쓴다. $$ L = L_{\mathcal{I}, \mathcal{M}} + L_{\mathcal{M}, \mathcal{I}} $$ 이미지·텍스트 encoder는 OpenCLIP으로 사전학습된 것을 고정하고, 나머지 모달의 encoder만 학습해서 이미 정렬된 이미지 공간에 붙인다. CLIP이 가진 언어-이미지 지식이 새 모달로 그대로 옮겨지는 구조다. 이렇게 하면 (이미지, 오디오)와 (이미지, 텍스트)만 학습했는데도 한 번도 같이 본 적 없는 (오디오, 텍스트)가 정렬되는 emergent alignment가 나타난다. 덕분에 학습하지 않은 조합의 retrieval이 zero-shot으로 되고, 과일 이미지 임베딩에 새소리 임베딩을 더해 과일 사이에 있는 새 사진을 찾는 임베딩 산술도 가능하다. 오디오 임베딩을 CLIP 텍스트 임베딩용 DALL·E 2 decoder에 넣어 소리로 이미지를 만드는 응용도 있었다. 이미지 encoder가 강할수록 emergent 성능이 좋아진다는 점에서 허브의 품질이 전체를 좌우한다. 정리하면 지난주에 배운 encoder, CLIP, cross-attention이 이번 주 모델들의 부품으로 그대로 다시 쓰였다. 🔍 추가적인 공부 및 조사 수업 이후 스스로 찾아보며 이해한 내용이나 새롭게 알게 된 내용을 정리합니다. 새롭게 알게 된 내용 LLaVA의 2단계 학습 : 1단계(feature alignment)에서는 CLIP과 LLM을 모두 고정하고 $W$만 학습한다. 데이터는 CC3M에서 걸러낸 이미지-캡션 쌍 595K개다. 2단계에서는 CLIP만 고정하고 $W$와 LLM을 함께 fine-tune한다(LLaVA-Instruct-158K). 수업의 "연결자만 학습"은 1단계에 해당하는 설명이었다. 공식 코드의 이미지 토큰 처리 : llava_arch.py의 prepare_inputs_labels_for_multimodal을 보면 입력 id 중 IMAGE_TOKEN_INDEX(-200) 위치에서 텍스트를 잘라 그 자리에 이미지 feature를 끼우고 torch.cat으로 붙인다. 이때 이미지 위치의 label은 IGNORE_INDEX(-100)로 채워서 loss를 계산하지 않는다. 이미지 토큰은 읽기만 하는 토큰이다. 이미지 토큰 개수는 패치 개수 : 과제의 ViT-B/32(224px)는 7×7=49개, LLaVA의 ViT-L/14(224px)는 16×16=256개, LLaVA-1.5의 ViT-L/14(336px)는 24×24=576개다. BLIP-2의 Q-Former는 32개 query로 압축하니까, LLaVA의 단순함 뒤에는 시퀀스 길이라는 비용이 있다. latent 압축률 : Stable Diffusion 계열은 downsampling factor 8을 쓴다. 512×512×3(786,432개 값)이 64×64×4(16,384개 값)가 되니 diffusion이 다루는 차원이 48배 줄어든다. InfoNCE와 상호정보량 : CPC 논문에 따르면 InfoNCE를 줄이는 것은 두 표현 사이 상호정보량의 하한을 올리는 것과 연결되고, 그 하한에 log N(N은 positive 1개와 negative를 합친 수)이 들어간다. 대조학습에서 큰 배치를 선호하는 이유 중 하나로 이해했다. 기존 내용과의 비교 또는 심화 내용 수업 내용 추가 조사 내용 LLaVA는 무거운 두 모델을 고정하고 가벼운 연결자만 학습 1단계만 그렇다. 2단계에서는 vision encoder만 고정하고 W와 LLM을 같이 fine-tune한다 연결자는 선형 층 1개, LLaVA-1.5부터 2층 MLP 1024차원(ViT-L)에서 4096차원(7B LLM)으로 보낼 때 선형은 약 420만 개, 2층 MLP는 약 2,100만 개 파라미터. 7B LLM에 비하면 아주 작다 이미지 토큰을 텍스트 사이에 concat 공식 코드는 이미지 위치 label을 -100으로 채워 loss에서 뺀다. loss는 답변 토큰에서만 계산 cross-attention은 QKT를 √d로 나눔 내적의 분산이 d에 비례해서 커지기 때문 (아래 유도 1) diffusion 손실은 노이즈 예측 오차 DDPM에서 ELBO의 각 항을 정리하고 가중치를 뗀 단순화 손실이 그 식이다 (아래 유도 2, 3) ImageBind는 InfoNCE로 정렬 InfoNCE는 상호정보량 하한을 키우는 목적함수다 (아래 유도 4) emergent alignment 과제 숫자로 삼각부등식 bound를 계산해보면 기하학만으로는 보장되지 않는다 (아래 유도 5) 📐 심화 : 공식 자료의 논리를 따라 직접 유도해보기 유도 1. cross-attention에서 √d로 나누는 이유 근거: Vaswani et al., Attention Is All You Need (arXiv:1706.03762), 3.2.1절 각주 $q$, $k$의 각 성분이 서로 독립이고 평균 0, 분산 1이라고 두자. $$ q \cdot k = \sum_{i=1}^{d} q_i k_i $$ $$ \mathbb{E}[q_i k_i] = \mathbb{E}[q_i] \mathbb{E}[k_i] = 0 $$ $$ \mathrm{Var}(q_i k_i) = \mathbb{E}[q_i^2] \mathbb{E}[k_i^2] - (\mathbb{E}[q_i k_i])^2 = 1 \cdot 1 - 0 = 1 $$ 각 항이 독립이므로 분산이 그대로 더해진다. $$ \mathrm{Var}(q \cdot k) = \sum_{i=1}^{d} \mathrm{Var}(q_i k_i) = d $$ $$ \mathrm{Var}\left(\frac{q \cdot k}{\sqrt{d}}\right) = \fra
JDBC, ORM,JPA, Hibernate, Spring Data JPA JDBC 자바 애플리케이션에서 데이터베이스에 접근하고 SQL을 실행하기 위한 표준 API JDBC를 직접 사용하는 경우 개발자는 SQL을 작성하고, 실행 결과를 자바 객체로 변환하는 작업도 처리 JDBC는 자바와 DB가 통신할 수 있는 수단을 제공하지만, 객체와 테이블을 자동으로 매핑 String sql = "SELECT * FROM memo WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setLong(1, 1L); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { Long id = rs.getLong("id"); String username = rs.getString("username"); } ### ORM - **객체지향 프로그래밍의 객체와 관계형 데이터베이스의 테이블을 매핑하는 기술** - 자바 애플리케이션에서는 객체를 사용하지만, 관계형 DB에서는 테이블과 행(Row)을 사용한다. 이러한 표현 방식의 차이를 해결하고 객체 중심으로 데이터를 다룰 수 있도록 돕는 기술이 ORM이다. ### JPA - **자바에서 ORM을 사용하기 위한 표준 명세** - JPA 자체가 ORM 기능을 구현한 프로그램인 것이 아님! - ORM을 구현하기 위한 인터페이스와 동작 규칙을 정의하고, 실제 동작은 JPA 구현체가 담당 예를 들어 JPA는 다음과 같은 인터페이스와 메서드를 정의한다 : - `EntityManager` - `EntityManagerFactory` - `persist()` - `find()` - `remove()` ### Hibernate - **JPA를 실제로 구현한 대표적인 ORM 프레임워크** - JPA API를 사용하여 엔티티의 저장이나 조회를 요청하면 Hibernate가 엔티티 매핑 정보를 바탕으로 필요한 SQL을 생성하고 실행한다. ### Spring Data JPA - JPA를 더 편리하게 사용할 수 있도록 지원하는 Spring Data 프로젝트의 모듈 - **JPA만 사용할 경우 개발자가 EntityManager를 이용하여 엔티티 저장, 조회 등의 작업을 직접 구현해야 하는데, Spring Data JPA를 사용하면 JpaRepository 인터페이스를 통해 기본적인 CRUD 기능을 간편하게 사용**할 수 있다. - Repository 구현체를 자동으로 생성하고, 내부적으로 JPA의 EntityManager 등을 이용해 DB 작업 수행 | 구분 | 개념 | 역할 | |---|---|---| | 🍀**JDBC** | 데이터베이스 접근 API | SQL 실행 및 DB 통신 | | 🍀**ORM** | 객체-관계 매핑 기술 | 객체와 관계형 DB 매핑 | | 🍀**JPA** | ORM 표준 명세 | ORM 사용을 위한 API와 규칙 정의 | | 🍀**Hibernate** | ORM 프레임워크 | JPA 기능 구현, SQL 생성 및 실행 | | 🍀**Spring Data JPA** | JPA 추상화 기술 | Repository를 통한 CRUD 및 쿼리 기능 제공 | --- ## 엔티티와 테이블 ### 엔티티(클래스) - 데이터베이스 테이블과 매핑되는 자바 클래스 - `@Entity`가 선언된 자바 클래스가 JPA에서 관리할 수 있는 엔티티 클래스가 된다. - JPA를 사용한다고 **반드시 DB 테이블이 새로 생성되는 것은 아니다.** _- Hibernate 설정에 따라_ ### 엔티티와 테이블 간 관계 - 엔티티 클래스 `Memo` 는 memo 테이블과 매핑된다. - 하나의 엔티티 인스턴스는 테이블의 하나의 행(Row)에 대응한다. #### 엔티티 클래스 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Memo { @Id @GeneratedValue(stragy = GeneratedType.IDENTITY) private Long id; @Column(nullable = false) private String username; @Column(nullable = false) private String contents; } #### DB 테이블 | id | username | contents | |-------|-------|-------| | 1 | Jude | Jude memo | | 2 | Judy | Judy memo | | 3 | Juice | Jucie memo | ## 엔티티 인스턴스 생성 엔티티 클래스와 DB 테이블이 매핑되었다고 해서 엔티티 인스턴스가 자동으로 생성되는 것은 아니다. ### 1. 개발자가 생성하는 경우 ```java Memo memo = new Memo(); 개발자가 new 키워드를 사용하여 직접 인스턴스를 생성 이 시점의 객체는 단순한 자바 객체, JPA의 영속성 컨텍스트에서 관리되는 상태❌ em.persist(memo); // 영속성 컨텍스트에 등록 persist() 를 호출하면 엔티티가 영속 상태 가 되고, 이후 적절한 시점에 DB에 INSERT SQL 실행 2. DB에서 데이터를 조회하는 경우 Memo memo = em.find(Memo.class, 1L); Hibernate는 필요할 경우 다음 작업을 수행한다: 엔티티 조회 요청 DB에 SELECT SQL 실행 조회 결과(Row) 확인 Memo 엔티티 인스턴스 생성 Row의 컬럼 값을 인스턴스 필드에 매핑 완성된 인스턴스 반환 ✨ [참고] JPA 영속성 컨텍스트에 이미 해당 엔티티가 존재하면 별도의 DB 조회나 새 인스턴스 생성 없이 기존 인스턴스를 반환할 수도 있다.
Call~Girls In Malviya Nagar ☎ 9643097474 Call Girls in Saket ¶¶Service, escorts Service in Home & Hotel in Delhi NCR 24 Hours Available Service Call Girls, Contact Aadi, +91-9643097474 (Any Time. Any Where) Call Girls in Delhi Charges, Shot 1500 Night 6000Call Girls In Delhi South Delhi Female Escort In Delhi Model College Girls In Delhi South Delhi Escorts Service Hauz Khas, Saket, Malviya Nagar, Lajpat Nagar, Munirka, Vasant Kunj, Vasant Vihar, Model Town, Nehru Place, Green Park, Safdarjung, Rk Puram, Khanpur, Rajiv Chowk, Greater Kailash, Kailash Colony, All,Model Escort Agency South Delhi WhatsApp +91- 9643097474 Delhi NCR Call Girls Contact Pooja, +91-9643097474 Call Girls in Delhi NCR in Delhi NCR Escorts in Delhi-NCR Escort Service In Delhi High Class Escort And Call Girls In Delhi Call Contact Aadi BHai, +91-9643097474 in Call South Delhi Malviya Nagar Delhi ,+91-9643097474 // We Provide You Hi Class Independent Call Girls Available In Connaught Place With Five Star Hotels. You Can Reach At Our Place in Delhi our place Which is very Clean Hygienic & 100% safe Accommodation.Get in touch with Me ((Pooja 9643097474-))”Get On the Line by Buzz Phone Call”((Aadi Bhai +91-9643097474 Available 24*7hr Top Grade Service/100% Cooperative All round Service.On the off chance that You Are Looking For Someone Who Can Give You Company In Weekend Of This Rainy Season Then You Can Choose Our Beautiful Connaught Place Central Delhi Escorts As Your Companion. These Girls Choose Escorts Profession Because They Want To Provide Some Relief That An Alone Person Face In Their Life.Sterile Full AC Neat and Clean Rooms Avail