![中文命名实体识别(Named Entity Recognition, NER)初探](https://cdn.explinks.com/wp-content/uploads/2024/09/explink1111.png)
中文命名实体识别(Named Entity Recognition, NER)初探
在人工智能领域,多模态模型的发展正在迅速改变我们对机器智能的认知。多模态模型能够同时处理文本、图像等多种数据类型,为各种应用场景提供了更强大的解决方案。最近,DeepSeek 团队发布了 Janus 系列模型,这一开源模型在多模态理解与生成方面取得了显著进展,为研究人员和开发者提供了强大的工具。
DeepSeek Janus 是一个创新的自回归框架,它将多模态理解与生成任务统一在一个模型中。与以往的多模态模型不同,Janus 通过分离视觉编码路径,专门处理理解任务和生成任务,从而解决了传统模型中视觉编码器在不同任务间角色冲突的问题。这种设计不仅提高了模型的灵活性,还提升了其在多模态任务中的性能。
Janus 的设计灵感来源于罗马神话中的双面神 Janus,象征着理解与生成之间的平衡。模型通过独立的视觉编码器分别处理高维语义信息和低维空间细节,使得多模态理解任务能够提取更丰富的语义特征,而视觉生成任务则能够生成更高质量的图像。
Janus 的核心创新在于分离视觉编码路径。在多模态理解任务中,模型需要提取图像中的高级语义信息,例如物体类别和视觉属性;而在视觉生成任务中,模型需要关注图像的局部细节和全局一致性。传统的多模态模型通常使用单一视觉编码器来处理这两种任务,这会导致性能上的妥协。Janus 通过引入两个独立的视觉编码器,分别针对理解任务和生成任务进行优化,从而解决了这一问题。
在多模态理解方面,Janus 在多个基准测试中取得了优异的成绩。例如,在 MMBench、POPE、MME 等数据集上,Janus 的表现超过了之前的统一模型和其他一些特定任务的模型。在视觉生成方面,Janus 在 GenEval 和 DPG-Bench 等基准测试中也表现出色,甚至在某些指标上超过了 OpenAI 的 DALL-E 3 等知名模型。
Janus 的架构基于 DeepSeek-LLM-1.3B 和 DeepSeek-LLM-7B,使用 SigLIP-L 作为视觉编码器,支持 384×384 的图像输入。模型通过独立的适配器将视觉特征映射到语言模型的输入空间,然后通过统一的自回归变换器进行处理。这种设计使得模型在处理多模态任务时更加灵活,并且可以轻松扩展到其他模态,例如点云、EEG 信号或音频数据。
Janus 的训练分为三个阶段。第一阶段主要训练适配器和图像头部,使模型能够初步理解图像内容并具备基本的视觉生成能力。第二阶段是统一预训练,使用多模态语料库对模型进行训练,使其能够同时学习多模态理解和生成任务。第三阶段是监督微调,通过指令调整数据来增强模型的指令遵循和对话能力。
DeepSeek Janus 提供了详细的使用指南和代码示例,方便开发者快速上手。模型已经在 Hugging Face 上发布,用户可以直接下载并使用。此外,Janus 还提供了 Gradio 和 FastAPI 的在线演示,方便用户进行测试和部署。
在 Python 3.8 及以上环境中,用户可以通过以下命令安装必要的依赖:
pip install -e .
以下是一个多模态理解的简单示例代码:
import torch
from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor
from janus.utils.io import load_pil_images
model_path = "deepseek-ai/Janus-1.3B"
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
tokenizer = vl_chat_processor.tokenizer
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
)
vl_gpt = vl_gpt.to(torch.bfloat16).cuda().eval()
conversation = [
{
"role": "User",
"content": "<image_placeholder>\nConvert the formula into latex code.",
"images": ["images/equation.png"],
},
{"role": "Assistant", "content": ""},
]
pil_images = load_pil_images(conversation)
prepare_inputs = vl_chat_processor(
conversations=conversation, images=pil_images, force_batchify=True
).to(vl_gpt.device)
inputs_embeds = vl_gpt.prepare_inputs_embeds(**prepare_inputs)
outputs = vl_gpt.language_model.generate(
inputs_embeds=inputs_embeds,
attention_mask=prepare_inputs.attention_mask,
pad_token_id=tokenizer.eos_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=512,
do_sample=False,
use_cache=True,
)
answer = tokenizer.decode(outputs[0].cpu().tolist(), skip_special_tokens=True)
print(f"{prepare_inputs['sft_format'][0]}", answer)
以下是一个文本到图像生成的示例代码:
import os
import PIL.Image
import torch
import numpy as np
from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor
model_path = "deepseek-ai/Janus-1.3B"
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
tokenizer = vl_chat_processor.tokenizer
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
)
vl_gpt = vl_gpt.to(torch.bfloat16).cuda().eval()
conversation = [
{
"role": "User",
"content": "A stunning princess from kabul in red, white traditional clothing, blue eyes, brown hair",
},
{"role": "Assistant", "content": ""},
]
sft_format = vl_chat_processor.apply_sft_template_for_multi_turn_prompts(
conversations=conversation,
sft_format=vl_chat_processor.sft_format,
system_prompt="",
)
prompt = sft_format + vl_chat_processor.image_start_tag
# 生成图像的函数
@torch.inference_mode()
def generate(
mmgpt: MultiModalityCausalLM,
vl_chat_processor: VLChatProcessor,
prompt: str,
temperature: float = 1,
parallel_size: int = 16,
cfg_weight: float = 5,
image_token_num_per_image: int = 576,
img_size: int = 384,
patch_size: int = 16,
):
input_ids = vl_chat_processor.tokenizer.encode(prompt)
input_ids = torch.LongTensor(input_ids)
tokens = torch.zeros((parallel_size*2, len(input_ids)), dtype=torch.int).cuda()
for i in range(parallel_size*2):
tokens[i, :] = input_ids
if i % 2 != 0:
tokens[i, 1:-1] = vl_chat_processor.pad_id
inputs_embeds = mmgpt.language_model.get_input_embeddings()(tokens)
generated_tokens = torch.zeros((parallel_size, image_token_num_per_image), dtype=torch.int).cuda()
for i in range(image_token_num_per_image):
outputs = mmgpt.language_model.model(inputs_embeds=inputs_embeds, use_cache=True, past_key_values=outputs.past_key_values if i != 0 else None)
hidden_states = outputs.last_hidden_state
logits = mmgpt.gen_head(hidden_states[:, -1, :])
logit_cond = logits[0::2, :]
logit_uncond = logits[1::2, :]
logits = logit_uncond + cfg_weight * (logit_cond-logit_uncond)
probs = torch.softmax(logits / temperature, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
generated_tokens[:, i] = next_token.squeeze(dim=-1)
next_token = torch.cat([next_token.unsqueeze(dim=1), next_token.unsqueeze(dim=1)], dim=1).view(-1)
img_embeds = mmgpt.prepare_gen_img_embeds(next_token)
inputs_embeds = img_embeds.unsqueeze(dim=1)
dec = mmgpt.gen_vision_model.decode_code(generated_tokens.to(dtype=torch.int), shape=[parallel_size, 8, img_size//patch_size, img_size//patch_size])
dec = dec.to(torch.float32).cpu().numpy().transpose(0, 2, 3, 1)
dec = np.clip((dec + 1) / 2 * 255, 0, 255)
visual_img = np.zeros((parallel_size, img_size, img_size, 3), dtype=np.uint8)
visual_img[:, :, :] = dec
os.makedirs('generated_samples', exist_ok=True)
for i in range(parallel_size):
save_path = os.path.join('generated_samples', "img_{}.jpg".format(i))
PIL.Image.fromarray(visual_img[i]).save(save_path)
generate(
vl_gpt,
vl_chat_processor,
prompt,
)
除了 Janus,DeepSeek 还发布了 JanusFlow,这是一个结合了自回归语言模型和流修正(Rectified Flow)的新型多模态模型。JanusFlow 通过在大语言模型框架内直接训练流修正,无需复杂的架构修改,显著提升了多模态任务的性能。
JanusFlow 在多模态理解与生成任务中表现出色,尤其是在图像生成方面,能够生成更高质量的图像。其架构设计简洁,易于扩展,为多模态模型的发展提供了新的方向。
DeepSeek Janus 系列模型的发布,标志着多模态人工智能领域的一个重要进步。通过分离视觉编码路径,Janus 解决了传统多模态模型中的关键问题,提升了模型的灵活性和性能。同时,JanusFlow 的创新设计进一步展示了结合自回归和流修正的潜力。
对于研究人员和开发者来说,Janus 系列模型提供了一个强大的开源工具,可以用于各种多模态应用的开发和研究。随着技术的不断发展,我们期待 DeepSeek 团队在未来带来更多突破性的成果。
如果你对 DeepSeek Janus 感兴趣,可以访问其 GitHub 仓库获取更多详细信息和代码资源。